这是示例数据集
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
我已经按id
和update 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()
答案 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)
使用
DataFrame.groupby
-使用映射器或一系列列对DataFrame或Series进行分组。.groupby.GroupBy.last
-计算组值的最后一个。DataFrame.replace
-用值替换to_replace中给出的值。例如。
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)
结合使用groupby
,apply
和iloc
:
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]
为您提供最新数据的行