我有两个数据帧:
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
很大。我需要根据supply
,df2
列中的相等值,在Quantity
中填充df1
列year
列中week
列的值,两个数据框中的region
,code
。
我写了条件:
df2['supply'] = df2['year'].isin(df1['year']) & df2['week'].isin(df1['week']) & df2['region'].isin(df1['region']) & df2['code'].isin(df1['code'])
他给了我True
或False
。但是我不能根据这个条件填写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']))
我想用我的条件写一个循环,但我不知道怎么做。
请帮助我理解我错在哪里?
答案 0 :(得分:1)
一种可能的解决方案是pd.merge
首先,删除df2上的“supply”列。
执行合并后,您将在df3中获得一个数量列,其中匹配行的值正确,df2中的行的NaN值在df1中没有匹配的行。
df3 = pd.merge(df2, df1, on = ['year','week','region','code'], how = 'outer')
然后您可以使用dropna
或fillna