我有两个这样的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中做到这一点?
答案 0 :(得分:1)
一种可能的解决方案是,对于每个dfM
行,使用它们的X
和Y
值来过滤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