繁体   English   中英

删除行并根据另一个排序 dataframe

[英]Drop rows and sort one dataframe according to another

我有两个 pandas 数据帧( df1df2 ):

# 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 从df2df1中的每个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM