簡體   English   中英

如何遍歷pandas DataFrame的一列並從另一列返回值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM