[英]Pandas Iterate through rows, compare column value with string in a list, return a value from another column
[英]How can I iterate through a column of a pandas DataFrame and return value from another column?
我之所以编写此代码,是因为我需要转到一个包含多个图像的文件夹,这些图像的名称需要更改。 我需要从文件名中获取有用的数字,在excel文件中搜索该数字,返回该行但另一列的对应值,并使用在另一列中找到的新值重命名文件。 我还需要它知道从文件名获得的有用数字是否出现在第1列或第2列中(该值是否出现在Nbr1或Nbr2中?)。 我的问题是文件名上的“有用数字”是一个字符串,而Excel中的值是数字。 我尝试将它们都更改为字符串或都更改为整数,但是DataFrame的列仍然是一个对象,因此我无法对其进行迭代并找到所需的值。
Nbr1 Nbr2 Nbr3
456 9630 778899
123 8520 445566
999 7410 112233
例如,如果图像名为“ 999-3.jpeg”,我希望将其重命名为*“ 112233c.jpeg”,“ 112233”是Excel文件另一列中“ 999”的对应值。
请随意批评我的代码,我知道它的结构不是很整洁,但是我最关心的是使它正常工作。 非常感谢你的帮助。
我使用了pandas和os,并多次将字符串从文件名更改为对文件名和DataFrame中的值进行整数处理。 我还将这些列存储在每个变量上,以查看是否可以对其进行迭代,但是它没有用。
import os
import pandas as pd
os.chdir("C:\\Users\\Documents\\Rename")
changes = {
"1":"a",
"2":"b",
"3":"c"
}
def pic_rename(separator):
table = pd.read_excel("List.xlsx")
df = pd.DataFrame(table)
column1 = df["Nbr1"]
column2 = df["Nbr2"]
name_list = []
for f in os.listdir():
file_name, file_ext = os.path.splitext(f)
if file_ext == (".jpg" or ".jpeg"):
useful_name, extra = file_name.split(separator)
useful_name = int(useful_name.strip())
name_list.append(useful_name)
counter1 = 0
counter2 = 0
for x in name_list:
if x in column1:
counter2 = 0
if counter1 == 0:
df = df.set_index("Nbr1", drop = True, append = False, inplace = False, verify_integrity=False)
result = df.loc[x, "Nbr3"]
extra = extra.strip()[-1]
final_name = str(result) + str(changes.get(extra))
os.rename(f, result + file_ext)
counter1 += 1
else:
result = df.loc[x, "Nbr3"]
extra = extra.strip()[-1]
final_name = str(result) + str(changes.get(extra))
os.rename(f, result + file_ext)
counter1 += 1
elif x in column2:
counter1 = 0
if counter2 == 0:
df = df.set_index("Nbr2", drop = True, append = False, inplace = False, verify_integrity=False)
result = df.loc[x, "Nbr3"]
extra = extra.strip()[-1]
final_name = str(result) + str(changes.get(extra))
os.rename(f, result + file_ext)
counter2 += 1
else:
result = df.loc[x, "Nbr3"]
extra = extra.strip()[-1]
final_name = str(result) + str(changes.get(extra))
os.rename(f, result + file_ext)
counter2 += 1
else:
print("This number isn't in Column 1 or 2")
else:
print("This file is not an image")
separator = input("Please insert the character that separates the useful name from the extra that you don't want")
pic_rename(separator)
我得到的最新错误是“ TypeError:'int'对象不可迭代”,但我又遇到了两个错误,主要是在尝试通过列(“ Nbr1”)遍历文件名并尝试以结果为“ Nbr3”。 我可以在几个小时后更详细地了解代码错误。
编辑:我当前遇到的问题是代码可以工作并且可以迭代,但是它没有在Excel列中找到值(即使我知道它在那里),并且它跳过了if并只打印了我的else语句。
我没有完全得到您的代码,但是这里有一些观察结果。
您可以使用以下方法更改数据框值:
df.astype(str)
它们将成为“对象”类型,但是对于字符串的赋值/比较是很好的。
要遍历数据框,可以使用:
for index, row in df.iterrows():
这将返回您要迭代的数据帧的行索引和整个行。 然后,要获取当前行的某些列的值,您可以简单地使用:
value1 = row['Nbr1']
value2 = row['Nbr2']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.