我有两个大熊猫DataFrame。
df1
看起来像这样:
Date A B
2020-03-01 12 15
2020-03-02 13 16
2020-03-03 14 17
[df2
期间,像这样:
Date C
2020-03-03 x
2020-03-01 w
2020-03-05 y
我想将df2
合并到df1
,以使值变成列。有点像一键编码:
Date A B w x y z
2020-03-01 12 15 1 0 0 0
2020-03-02 13 16 0 0 0 1
2020-03-03 14 17 0 1 0 0
所以第一行在w
列中有一个1,因为在df2['C']
中具有相同日期“ 2020-03-01”的行是“ w”。 z
列用于df1
中的那些条目,而df2
中没有相应的日期。 (对不起,如果我无法更好地解释它。请随时澄清。)
作为解决方案,我想到了先合并df1
和df2
,如下所示:
Date A B C
2020-03-01 12 15 w
2020-03-02 13 16 -
2020-03-03 14 17 x
然后使用以下方法进行一键编码:
df1['w'] = (df2['C'] == 'w')*1.0
df1['y'] = (df2['C'] == 'y')*1.0
...
但是我仍在思考如何编写第一部分,整个解决方案甚至可能都不有效。因此,我想问的是,您是否知道一种更有效的方法,例如DataFrame方法的某种组合。谢谢。
您可以使用get_dummies
和reindex
来获得z
值:
df1.merge(pd.get_dummies(df2['C'])
.reindex(list('wxyz'), axis=1, fill_value=0)
.assign(Date=df2.Date),
on='Date',
how='left'
).fillna(0)
输出:
Date A B w x y z
0 2020-03-01 12 15 1.0 0.0 0.0 0.0
1 2020-03-02 13 16 0.0 0.0 0.0 0.0
2 2020-03-03 14 17 0.0 1.0 0.0 0.0
假设df2如下:
Date C
0 2020-03-03 x
1 2020-03-01 w
2 2020-03-02 z
3 2020-03-05 y
可以将get_dummies
和df.merge
一起使用
out = df1.merge(pd.get_dummies(df2['C']).assign(Date=df2['Date'])
,on='Date',how='left').fillna(0)
print(out)
或:
(df1.merge(df2,on='Date',how='left').pivot_table(index=['Date','A','B'],columns=['C']
,aggfunc=len,fill_value=0).reset_index().rename_axis(None,axis=1))
Date A B w x y z
0 2020-03-01 12 15 1 0 0 0
1 2020-03-02 13 16 0 0 0 1
2 2020-03-03 14 17 0 1 0 0