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

2024-09-29 21:23:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我之所以要写这段代码,是因为我需要转到一个文件夹,其中包含几个需要更改名称的图像。我需要从文件名中获取有用的数字,在excel文件中搜索该数字,为该行返回相应的值,但返回一个不同的列,然后用在不同列中找到的新值重命名该文件。我还需要它知道从文件名中获得的有用数字是否存在于第1列或第2列中(值是否存在于Nbr1或Nbr2中?)。我的问题是文件名上的“有用数字”是一个字符串,而Excel中的值是数字。我尝试将它们都更改为string或integer,但是DataFrame的列仍然是一个对象,因此我无法遍历它并找到所需的值。你知道吗

Nbr1  Nbr2  Nbr3
456  9630  778899
123  8520  445566
999  7410  112233

例如,如果一个图像名为“”999-3.jpeg“,我希望它被重命名为*”112233c.jpeg“,”112233“是Excel文件另一列中“999”的对应值。你知道吗

请随意批评我的代码,我知道它不是太有组织或干净,但我最关心的是让它工作。非常感谢你的帮助。你知道吗

我使用了pandas和os,并多次将文件名和数据帧中的值从string更改为integer。我还将每一列存储在一个变量上,以查看是否可以对它们进行迭代,但没有成功。你知道吗

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'object is not iterable”,但我又得到了几个错误,主要是在尝试用文件名遍历列(“Nbr1”)并尝试得到结果“Nbr3”时。我可以更具体的错误代码在几个小时内。你知道吗

Edit:我目前遇到的问题是,代码可以工作并进行迭代,但它在Excel列中找不到值(即使我知道它在那里),而且它跳过if,只打印else语句。你知道吗


Tags: namefalsedfos文件名数字resultextra
1条回答
网友
1楼 · 发布于 2024-09-29 21:23:44

我没有完全理解你的代码,但这里有一些观察。你知道吗

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

df.astype(str)

它们将成为“object”类型,但这对于字符串的赋值/比较来说是很好的。你知道吗

要在数据帧上迭代,可以使用:

for index, row in df.iterrows():

它将返回要迭代的数据帧的行和整行的索引。然后,要获取当前行中某列的某些值,只需使用:

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

相关问题 更多 >

    热门问题