所以我有一个数据框(或系列),其中“A”列的每一列总是出现 4 次,如下所示:
df = pd.DataFrame([['foo'], ['foo'], ['foo'], ['foo'], ['bar'], ['bar'], ['bar'], ['bar']], columns=['A']) A 0 foo 1 foo 2 foo 3 foo 4 bar 5 bar 6 bar 7 bar
我还有另一个数据框,其值与 A 列中的值类似,但它们并不总是有 4 个值。它们还有更多列,如下所示:
df_key = pd.DataFrame([['foo', 1, 2], ['foo', 3, 4], ['bar', 5, 9], ['bar', 2, 4], ['bar', 1, 9]], columns=['A', 'B', 'C']) A B C 0 foo 1 2 1 foo 3 4 2 bar 5 9 3 bar 2 4 4 bar 1 9
我想将它们合并,使得它们最终像这样使用类似的东西:
df.merge(df_key, how='left', on='A', copy=False) A B C 0 foo 1 2 1 foo 3 4 2 foo NaN NaN 3 foo NaN NaN 4 bar 5 9 5 bar 2 4 6 bar 1 9 7 bar NaN NaN
但我最终得到的却是这样的结果。有什么建议吗?
A B C 0 foo 1 2 1 foo 3 4 2 foo 1 2 3 foo 3 4 4 foo 1 2 5 foo 3 4 6 foo 1 2 7 foo 3 4 8 bar 5 9 9 bar 2 4 10 bar 1 9 11 bar 5 9 12 bar 2 4 13 bar 1 9 14 bar 5 9 15 bar 2 4 16 bar 1 9 17 bar 5 9 18 bar 2 4 19 bar 1 9
您需要使用groupby+创建代理列cumcount来对行进行重复数据删除,然后在调用时包含这些列merge:
groupby
cumcount
merge
a = df.assign(D=df.groupby('A').cumcount()) b = df_key.assign(D=df_key.groupby('A').cumcount()) a.merge(b, on=['A', 'D'], how='left').drop('D', 1) A B C 0 foo 1.0 2.0 1 foo 3.0 4.0 2 foo NaN NaN 3 foo NaN NaN 4 bar 5.0 9.0 5 bar 2.0 4.0 6 bar 1.0 9.0 7 bar NaN NaN