将包含多列的数据框过滤为唯一ID

时间:2018-01-08 14:27:50

标签: pandas dataframe filter

我有一个像这样的庞大数据框(在不同的行中重复了几个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会将所有信息聚合在一行中。任何帮助表示赞赏!提前谢谢!

2 个答案:

答案 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