通过比较pandas中两个数据帧的几列来填写列

时间:2017-07-17 15:43:53

标签: python pandas

我有两个数据帧:

                       df1
    year   month    week   region    code    Quantity   
0   2017     6       22      ZZ      1700      7000
1   2017     8       28      TT      1780      4000
...

                       df2
    year    week    region    code     supply
0   2017     20       ZZ      1700      NaN 
1   2017     21       ZZ      1700      NaN 
2   2017     22       ZZ      1700      NaN
3   2017     23       ZZ      1700      NaN
4   2017     24       ZZ      1700      NaN
...

df1通常很小,df2很大。我需要根据supplydf2列中的相等值,在Quantity中填充df1year列中week列的值,两个数据框中的regioncode

我写了条件:

df2['supply'] = df2['year'].isin(df1['year']) & df2['week'].isin(df1['week']) & df2['region'].isin(df1['region']) & df2['code'].isin(df1['code'])

他给了我TrueFalse。但是我不能根据这个条件填写supply列。

我试过了:

df2['supply'] = df1['Quantity'].where(df2['year'].isin(df1['year']) & df2['week'].isin(df1['week']) & df2['region'].isin(df1['region']) & df2['code'].isin(df1['code']))

我想用我的条件写一个循环,但我不知道怎么做。

请帮助我理解我错在哪里?

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是pd.merge 首先,删除df2上的“supply”列。

执行合并后,您将在df3中获得一个数量列,其中匹配行的值正确,df2中的行的NaN值在df1中没有匹配的行。

 df3 = pd.merge(df2, df1, on = ['year','week','region','code'], how = 'outer')

然后您可以使用dropnafillna

删除NaN值或使用默认值填充它们