合并两个具有不同形状的数据框中的列

时间:2018-10-12 03:05:29

标签: python

我有两个这样的df:

  dfA
Out[191]: 
   a  b  c  d
0  N  M  1  3
1  S  F  2  4
1  S  F  2  4

另外一个像这样的人:

dfM
Out[192]: 
   X  Y   d1   d2   d3
0  N  M  0.1  0.2  0.3
1  S  F  1.0  2.0  3.0

现在,我想将这两个合并以获得这样的df:

   a  b  c  d  e
0  N  M  1  3  0.1
1  S  F  2  4  1.0
1  S  F  2  4  2.0

合并的df具有dfM d列中的值,这些列根据dfA行重复的次数填充。 如何在python中做到这一点?

2 个答案:

答案 0 :(得分:1)

一种可能的解决方案是,对于每个dfM行,使用它们的XY值来过滤dfA行,并将'e'列设置为其余dfM行的值列表。请查看以下示例:

for i, row in dfM.iterrows():
    d_values = row[2:].tolist()
    indexes = list(dfA[(dfA.a == row.X) & (dfA.b == row.Y)].index)
    dfA.loc[indexes, "e"] = d_values[:len(indexes)]

答案 1 :(得分:1)

您可以将cumcount用作merge的助手计数器列,并进行左连接,第二个DataFrame也会由melt重塑:

dfA['groups'] = dfA.groupby(['a','b']).cumcount()

dfM1 = dfM.melt(['X','Y'], value_name='e')
dfM1['groups'] = dfM1.groupby(['X','Y']).cumcount()
print (dfM1)
   X  Y variable    e  groups
0  N  M       d1  0.1       0
1  S  F       d1  1.0       0
2  N  M       d2  0.2       1
3  S  F       d2  2.0       1
4  N  M       d3  0.3       2
5  S  F       d3  3.0       2

d = {'X':'a', 'Y':'b'}
df = (dfA.merge(dfM1.rename(columns=d), on=['a','b', 'groups'], how='left')
         .drop(['variable','groups'],axis=1))
print (df)
   a  b  c  d    e
0  N  M  1  3  0.1
1  S  F  2  4  1.0
2  S  F  2  4  2.0