【问题标题】:How can I iterate through a column of a pandas DataFrame and return value from another column?如何遍历 pandas DataFrame 的一列并从另一列返回值?
【发布时间】:2020-01-01 05:18:18
【问题描述】:

我正在编写此代码,因为我需要转到一个文件夹,该文件夹包含多个我需要更改名称的图像。我需要从文件名中获取有用的数字,在 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' object is not iterable”,但我又遇到了几个错误,主要是在尝试通过列(“Nbr1”)迭代文件名并尝试结果得到“Nbr3”。我可以在几个小时内更具体地了解代码错误。

编辑:我目前遇到的问题是代码可以工作和迭代,但它没有在 Excel 列中找到值(即使我知道它在那里),它正在跳过 if 并只打印我的 else 语句.

【问题讨论】:

    标签: python pandas rename


    【解决方案1】:

    我没有完全了解您的代码,但这里有一些观察。

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

    df.astype(str)
    

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

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

    for index, row in df.iterrows():
    

    这将返回该行的索引以及您正在迭代的数据框的整行。然后要获取当前行的列的一些值,您可以简单地使用:

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

    【讨论】:

    • 嗨!非常感谢您的帮助,我的代码中是否有任何特别令人困惑或不清楚的地方难以理解?我已经尝试过 astype(str) 但无法使其工作。您的第三个建议很有帮助,但我有一个新问题,是否有必要设置 DataFrame 的索引才能使用 .loc 并从每一行的另一列中查找值?我遇到了一个问题,因为我的函数每次迭代都会将索引设置为相同的东西,这会破坏我的代码。
    • 不一定。例如,假设您想在列Nbr2 中查找字符串'abc'。您可以使用df.loc[df['Nbr2'] == 'abc'] 过滤DataFrame。这样,您将仅使用列Nbr2 具有值'abc' 的行来过滤DataFrame。此外,如果您想分享更新后的代码,可以更轻松地为您提供帮助。
    • 非常感谢您的帮助,row[] 贡献帮助我找到了解决方法,并且我得到了它的工作。非常感谢!编辑:我的问题是,将索引设置为特定列,我没有复制它,所以在我将它设置为索引后它无法迭代它。复制它解决了这个问题。
    猜你喜欢
    • 2017-09-11
    • 2020-06-18
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多