[英]Drop rows and sort one dataframe according to another
我有两个 pandas 数据帧( df1
和df2
):
# df1
ID COL
1 A
2 F
2 A
3 A
3 S
3 D
4 D
# df2
ID VAL
1 1
2 0
3 0
3 1
4 0
我的目标是 append 从df2
到df1
中的每个ID
的相应val
。 但是,这种关系不是一对一的(这是我客户的错,对此我无能为力)。 为了解决这个问题,我想按df2['ID']
对df1
进行排序,使得df1['ID']
与df2['ID']
相同。
所以基本上,对于 0 到len(df2)
中的任何行i
:
df1.loc[i, 'ID'] == df2.loc[i, 'ID']
然后将第i
行保留在df1
中。df1.loc[i, 'ID'].= df2,loc[i, 'ID']
然后从df1
中删除第i
行并重复。期望的结果是:
ID COL
1 A
2 F
3 A
3 S
4 D
这样,我可以使用pandas.concat([df1, df2['ID']], axis=0)
将df2[VAL]
分配给df1
。
有没有标准化的方法来做到这一点? pandas.merge()
有这样做的方法吗?
在这被投票为重复之前,请意识到len(df1) != len(df2)
,所以像这样的线程并不是我想要的。
这可以通过合并ID
和每个ID
中的顺序来完成:
(df1.assign(idx=df1.groupby('ID').cumcount())
.merge(df2.assign(idx=df2.groupby('ID').cumcount()),
on=['ID','idx'],
suffixes=['','_drop'])
[df1.columns]
)
Output:
ID COL
0 1 A
1 2 F
2 3 A
3 3 S
4 4 D
我能看到的获得所需结果的最简单方法是:
# Add a count for each repetition of the ids to temporary frames
x = df1.assign(id_counter=df1.groupby('ID').cumcount())
y = df2.assign(id_counter=df2.groupby('ID').cumcount())
# Merge using the ID and the repetition counter
df1 = pd.merge(x, y, how='right', on=['ID', 'id_counter']).drop('id_counter', axis=1)
这将产生这个 output:
ID COL VAL
0 1 A 1
1 2 F 0
2 3 A 0
3 3 S 1
4 4 D 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.