我有两个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 B:
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的列中,如果为true,例如dfB的第一行表示,那么我要将dfA.region中的 region 值添加到dfB的 region 中,该值目前为NA。
这是我的代码,我不确定是否正确:
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')
答案 0 :(得分:0)
这里的主要问题似乎是在第二个数据集中找到一个产品列,您可以在其中进行联接。目前尚不清楚您究竟如何确定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')
这里最重要的是生成一个列,您可以将其加入以进行查找
答案 1 :(得分:0)
如果我在您的位置,我会创建一些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()