熊猫 groupby 与 None

Mic*_*ner 7 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)
Run Code Online (Sandbox Code Playgroud)

这给出了下表

    身份证姓氏名字
0 1 克林顿比尔
1 1 克林顿威廉
2 南克林顿比尔
3 南克林顿威廉
4 1 NaN 无
5 2 布什乔治 W.
6 2 布什乔治
7 3 NaN 无
8 南奥巴马巴拉克
9 4 奥巴马 巴拉克

我想按idand分组last_name,删除重复项,并None在有多个条目时删除。所以输出应该像

              名
身份证姓氏           
1 克林顿法案
    克林顿威廉
2 布什乔治 W.
    布什乔治
3 无 无
4 奥巴马

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

任何优雅的想法?

raf*_*elc 5

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
Run Code Online (Sandbox Code Playgroud)