Pandas合并具有重复ID的行有条件地适用于CSV

问题描述 投票:1回答:3

我有以下df,我想合并具有相同ID的行,除非有重复

Ids      A   B   C   D   E  F   G    H   I  J
4411    24  2   55  26  1                   
4411                        24  2   54  26  0
4412    22  4   54  26  0                   
4412                        18  8   54  26  0
7401    12  14  54  26  0                   
7401                        0   25  53  26  0
7402    24  2   54  26  0                   
7402                        25  1   54  26  0
10891   16  10  54  26  0                   
10891                       3   23  54  26  0
10891                       5   10  6   15  0

示例输出

Ids      A   B   C   D   E  F   G    H   I  J
4411    24  2   55  26  1   24  2   54  26  0                               
4412    22  4   54  26  0   18  8   54  26  0                                   
7401    12  14  54  26  0   0   25  53  26  0                                   
7402    24  2   54  26  0   25  1   54  26  0                                   
10891   16  10  54  26  0   3   23  54  26  0               
10891                       5   10  6   15  0

我试过groupby但是当你写csv时会抛出错误。

python pandas csv dataframe
3个回答
2
投票

该解决方案使用Divakar的justify功能。如果需要,请提前转换为数字:

df = df.apply(pd.to_numeric, errors='coerce', axis=1)

现在,请致电groupby + transform

df.set_index('Ids')\
  .groupby(level=0)\
  .transform(
      justify, invalid_val=np.nan, axis=0, side='up'
  )\
  .dropna(how='all')

          A     B     C     D    E     F     G     H     I    J
Ids                                                            
4411   24.0   2.0  55.0  26.0  1.0  24.0   2.0  54.0  26.0  0.0
4412   22.0   4.0  54.0  26.0  0.0  18.0   8.0  54.0  26.0  0.0
7401   12.0  14.0  54.0  26.0  0.0   0.0  25.0  53.0  26.0  0.0
7402   24.0   2.0  54.0  26.0  0.0  25.0   1.0  54.0  26.0  0.0
10891  16.0  10.0  54.0  26.0  0.0   3.0  23.0  54.0  26.0  0.0
10891   NaN   NaN   NaN   NaN  NaN   5.0  10.0   6.0  15.0  0.0

2
投票

这应该很慢,但可以达到你的需要

df.replace('',np.nan).groupby('Ids').apply(lambda x: pd.DataFrame(x).apply(lambda x: sorted(x, key=pd.isnull),0)).dropna(axis=0,thresh=2).fillna('')
Out[539]: 
     Ids     A     B     C     D    E     F     G     H     I    J
0   7402  24.0   2.0  54.0  26.0  0.0  25.0   1.0  54.0  26.0  0.0
2  10891  16.0  10.0  54.0  26.0  0.0   3.0  23.0  54.0  26.0  0.0
3  10891                                5.0  10.0   6.0  15.0  0.0

0
投票

假设所有空白值都是nan,则使用groupby和dropna的另一个选项:

df.loc[:,'A':'E'] = df.groupby('Ids').apply(lambda x: x.loc[:,'A':'E'].ffill(limit=1))
df.dropna(subset=['F','G','H','I','J'])
© www.soinside.com 2019 - 2024. All rights reserved.