我有一个像这样的庞大数据框(在不同的行中重复了几个ID):
Id Phone Email Product Age
1 Null g@ A 20
1 028 g@ Null Null
1 028 Null A Null
2 040 Null B 25
2 Null t@ B Null
3 015 b@ E 23
4 023 c@ D 30
如何获得具有预期输出的最终数据框,如:
Id Phone Email Product Age
1 028 g@ A 20
2 040 t@ B 25
3 015 b@ E 23
4 023 c@ D 30
在最终输出中,我预计唯一ID会将所有信息聚合在一行中。任何帮助表示赞赏!提前谢谢!
答案 0 :(得分:2)
如果只想要第一个值,您可以使用:
f = lambda x: x.dropna().iloc[0]
df = df.replace('Null', np.nan).groupby('Id').agg(f)
print (df)
Phone Email Product Age
Id
1 028 g@ A 20
2 040 t@ B 25
3 015 b@ E 23
4 023 c@ D 30
但如果想要所有独特的价值观:
f = lambda x: ', '.join(x.dropna().drop_duplicates().astype(str))
#alternative solution
#f = lambda x: ', '.join(set(x.dropna()))
df = df.replace('Null', np.nan).groupby('Id').agg(f)
print (df)
Phone Email Product Age
Id
1 028 g@ A 20
2 040 t@ B 25
3 015 b@ E 23
4 023 c@ D 30
答案 1 :(得分:1)
假设您的真实DF有NaN
而不是Null
:
In [165]: df.groupby('Id').first()
Out[165]:
Phone Email Product Age
Id
1 28.0 g@ A 20.0
2 40.0 t@ B 25.0
3 15.0 b@ E 23.0
4 23.0 c@ D 30.0
否则:
In [168]: df.replace('Null', np.nan).groupby('Id').first()
Out[168]:
Phone Email Product Age
Id
1 028 g@ A 20
2 040 t@ B 25
3 015 b@ E 23
4 023 c@ D 30
或者(如果你点击bug, specified by @jezrael in comments):
In [171]: df.replace('Null',np.nan).groupby('Id').agg(lambda x: x[x.first_valid_index()]).reset_index()
Out[171]:
Id Phone Email Product Age
0 1 028 g@ A 20
1 2 040 t@ B 25
2 3 015 b@ E 23
3 4 023 c@ D 30