如何以下列方式合并两个DataFrame?

问题描述 投票:1回答:2

我有两个大熊猫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中没有相应的日期。 (对不起,如果我无法更好地解释它。请随时澄清。)

作为解决方案,我想到了先合并df1df2,如下所示:

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方法的某种组合。谢谢。

python pandas dataframe
2个回答
3
投票

您可以使用get_dummiesreindex来获得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

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_dummiesdf.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
© www.soinside.com 2019 - 2024. All rights reserved.