熊猫|合并具有相同ID的行

时间:2019-10-03 11:40:02

标签: python pandas dataframe

这是示例数据集

id         firstname    lastname      email               update date
A1         wendy         smith         ws@mail.com        2018-01-02
A1         wendy         smith         smith@mail.com     2019-02-03 
A2         harry         lynn          lynn@mail.com      2016-04-03
A2         harry                       harylynn@mail.com  2019-03-12
A3         tinna         dickey        tinna@mail.com     2016-04-03
A3         tinna         dickey        tinna@mail.com     2013-06-12
A4         Tom           Lee           Tom@mail.com       2012-06-12
A5         Ella                        Ella@mail.com      2019-07-12
A6         Ben           Lang          Ben@mail.com       2019-03-12

我已经按idupdate date对数据集进行了排序,我想合并具有相同id的行,如果一行具有空值,请用相同的{ {1}}(如果有冲突),请使用最新的版本。对于没有重复id的行,请保留空白单元格。

输出应为:

id

我的尝试是使用id firstname lastname email update date A1 wendy smith smith@mail.com 2019-02-03 A2 harry lynn harylynn@mail.com 2019-03-12 A3 tinna dickey tinna@mail.com 2019-03-12 A4 Tom Lee Tom@mail.com 2012-06-12 A5 Ella Ella@mail.com 2019-07-12 A6 Ben Lang Ben@mail.com 2019-03-12 合并具有空值的行并保留最后一个重复项,但是结果似乎影响了其他应该具有空值的单元格(例如A5中的lastname应该为empty)。

ffill()

4 个答案:

答案 0 :(得分:2)

使用GroupBy.ffill仅向前填充同一组。然后使用drop_duplicates

ionic Cordova build android --prod --release

或者使用assign一行(但我认为可读性较低):

df['lastname'] = df.groupby('id')['lastname'].ffill()
df = df.drop_duplicates('id', keep='last')

输出

df.assign(lastname=df.groupby('id')['lastname'].ffill()).drop_duplicates('id', keep='last')

答案 1 :(得分:1)

使用

例如。

df = df.replace('',np.nan, regex=True)
df1 = df.groupby('id',as_index=False,sort=False).last()
print(df1)

   id firstname lastname              email  updatedate
0  A1     wendy    smith     smith@mail.com  2019-02-03
1  A2     harry     lynn  harylynn@mail.com  2019-03-12
2  A3     tinna   dickey     tinna@mail.com  2013-06-12
3  A4       Tom      Lee       Tom@mail.com  2012-06-12
4  A5      Ella      NaN      Ella@mail.com  2019-07-12
5  A6       Ben     Lang       Ben@mail.com  2019-03-12

答案 2 :(得分:1)

尝试一下:

df.groupby('id').ffill().drop_duplicates('id', keep='last')

输出:

   id firstname lastname              email  update date
1  A1     wendy    smith     smith@mail.com  2019-02-03 
3  A2     harry     lynn  harylynn@mail.com   2019-03-12
5  A3     tinna   dickey     tinna@mail.com   2013-06-12
6  A4       Tom      Lee       Tom@mail.com   2012-06-12
7  A5      Ella      NaN      Ella@mail.com   2019-07-12
8  A6       Ben     Lang       Ben@mail.com   2019-03-12

答案 3 :(得分:0)

结合使用groupbyapplyiloc

df.groupby('id', as_index=False).apply(lambda x: x.fillna(method='ffill').iloc[0])

   id firstname lastname              email  update date
0  A1     wendy    smith     smith@mail.com  2019-02-03
1  A2     harry     lynn  harylynn@mail.com  2019-03-12
2  A3     tinna   dickey     tinna@mail.com  2019-03-12
3  A4       Tom      Lee       Tom@mail.com  2019-06-12
4  A5      Ella      NaN      Ella@mail.com  2019-07-12
5  A6       Ben     Lang       Ben@mail.com  2019-03-12
  • groupby通过唯一ID对数据框进行分组
  • fillna用具有非NaN值的行填充所有NaN值
  • iloc[-1]为您提供最新数据的行