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

2024-10-03 21:24:55 发布

您现在位置: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具有dfmd列中的值,该列根据dfA行的重复次数填充。 如何在python中实现这一点?你知道吗


Tags: dfout次数d2d1d3dfadfm
2条回答

可以使用^{}作为^{}的helper counter列,并使用left join,第二个数据帧也由^{}重塑:

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

一种可能的解决方案是,对于每个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)]

相关问题 更多 >