熊猫groupby,无

时间:2018-09-24 14:32:29

标签: pandas pandas-groupby

对于数据框df

df = pd.DataFrame({'id': ['1', '1', None, None, '1', '2', '2', '3', None, '4'], 
               'last_name': ['Clinton', 'Clinton', 'Clinton','Clinton', None, 'Bush', 'Bush', None, 'Obama', 'Obama'],
               'first_name': ['Bill', 'William', 'Bill', 'William', None, 'Georg W.', 'Georg', None, 'Barack', 'Barack']})

df['id'] = df['id'].astype('category')
print(df)

给出下表

    id last_name first_name
0    1   Clinton       Bill
1    1   Clinton    William
2  NaN   Clinton       Bill
3  NaN   Clinton    William
4    1       NaN       None
5    2      Bush   Georg W.
6    2      Bush      Georg
7    3       NaN       None
8  NaN     Obama     Barack
9    4     Obama     Barack

我想按idlast_name分组,删除重复项,并删除None(如果有多个条目)。所以输出应该像

              first_name
id  last_name           
1   Clinton       Bill
    Clinton       William
2   Bush          Georg W.
    Bush          Georg
3   None          None
4   Obama         Barack

我的问题之一是groupby不起作用,因为它排除了None / NaN值。

有什么好主意吗?

1 个答案:

答案 0 :(得分:1)

IIUC,假设您的数据框具有与发布的数据框相似的结构,则可以使用ffill()并按其分组,然后,dropna仅在每个分组的len为大于1。

df.groupby([df.id.ffill(), df.last_name.ffill()]).apply(lambda s: s.dropna() if len(s) > 1 else s).reset_index(drop=True)

    id  last_name   first_name  id2
0   1   Clinton     Bill        1
1   1   Clinton     William     1
2   2   Bush        Georg W.    2
3   2   Bush        Georg       2
4   3   None        None        3
5   NaN Obama       Barack      3