簡體   English   中英

如何同時遍歷pandas的列和行?

[英]How to iterate through pandas columns and rows simultaneously?

我有兩個 df A & B,我想遍歷 df B 的某些列並檢查其所有行的值並查看 A 中的一列中是否存在值,並使用 A 的其他列的值填充空值。

df 答:

 country region product
 USA     NY     apple
 USA     NY     orange
 UK      LON    banana
 UK      LON    chocolate
 CANADA  TOR    syrup 
 CANADA  TOR    fish

df乙:

 country ID    product1     product2     product3     product4     region 
 USA     123   other stuff  other stuff  apple        NA           NA
 USA     456   orange       other stuff  other stuff  NA           NA
 UK      234   banana       other stuff  other stuff  NA           NA
 UK      766   other stuff  other stuff  chocolate    NA           NA
 CANADA  877   other stuff  other stuff  syrup        NA           NA
 CANADA  109   NA           fish         NA           other stuff  NA

所以我想遍歷 dfB,例如查看 dfA.product ( apple ) 是否在 dfB.product1-product4 的列中,如果真如 dfB 的第一行所示,那么我想添加來自 dfA.region 的區域值進入現在是 NA 的 dfB區域

這是我的代碼,我不確定它是否正確:

import pandas as pd 
from tqdm import tqdm


def fill_null_value(dfA, dfB):
    for i, row in tqdm(dfA.iterrows()):
        for index, row in tqdm(dfB.iterrows()):
            if dfB['product1'][index] == dfA['product'][i]:
                dfB['region'] =  dfA['region '][i]

            elif dfB['product2'][index] == dfA['product'[i]:
                dfB['region'] =  dfA['region'][i]

            elif dfB['product3'][index] == dfA['product'][i]:
                dfB['region'] =  dfA['region'][i]

            elif dfB['product4'][index] == dfA['product'][i]:
                dfB['region'] =  dfA['region'][i]

            else:
                dfB['region '] = "not found"


    print('outputing data')
    return dfB.to_excel('test.xlsx')

這里的主要問題似乎是在您的第二個數據集中為產品找到一個列,您可以對其進行連接。 目前尚不清楚您究竟如何決定df_b中各個產品列中的哪些值是用作查找鍵還是被忽略的鍵。

但是,假設您的df_a包含一個詳盡的產品值列表,並且一旦您可以執行以下操作(簡化您的示例),這些值中的每一個都只會出現在一行中:

import pandas as pd

df_a = pd.DataFrame({'Region':['USA', 'Canada'], 'Product': ['apple', 'banana']})
df_b = pd.DataFrame({'product1': ['apple', 'xyz'], 'product2': ['xyz', 'banana']})

product_cols = ['product1', 'product2']

df_b['Product'] = df_b[product_cols].apply(lambda x: x[x.isin(df_a.Product)][0], axis=1)
df_b = df_b.merge(df_a, on='Product')

這里最重要的是生成一個列,您可以加入該列進行查找

如果我在你那里我會創建一些join然后concat它們並drop duplicates

df_1 = df_A.merge(df_B, right_on=['country', 'product'], left_on=['country', 'product1'], how='right')
df_2 = df_A.merge(df_B, right_on=['country', 'product'], left_on=['country', 'product2'], how='right')
df_3 = df_A.merge(df_B, right_on=['country', 'product'], left_on=['country', 'product3'], how='right')
df_4 = df_A.merge(df_B, right_on=['country', 'product'], left_on=['country', 'product4'], how='right')

df = pd.concat([df_1, df_2, df_3, df_4]).drop_duplicates()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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