如何遍历pandas DataFrame的一列并从另一列返回值?

时间:2019-08-28 03:21:29

标签: python pandas rename

我正在编写此代码是因为我需要转到一个包含多个图像的文件夹,这些图像的名称需要更改。我需要从文件名中获取有用的数字,在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”是“ 999”的对应值在Excel文件的另一列中。

可以随意批评我的代码,我知道它的代码不是太整齐或整洁,但是我最关心的是使它能够正常工作。非常感谢你的帮助。

我使用了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语句。

1 个答案:

答案 0 :(得分:0)

我没有完全得到您的代码,但这是一些观察结果。

您可以使用以下方法更改数据框值:

df.astype(str)

它们将成为“对象”类型,但对于字符串的赋值/比较是很好的。

要遍历数据框,可以使用:

for index, row in df.iterrows():

这将返回您要迭代的数据帧的行索引和整个行。然后,只需使用以下命令即可获取当前行的某些列的值:

value1 = row['Nbr1']
value2 = row['Nbr2']