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