如何同时遍历熊猫列和行?

时间:2019-08-28 16:58:09

标签: python pandas dataframe

我有两个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')

2 个答案:

答案 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()