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值。
任何优雅的想法?
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)
| 归档时间: |
|
| 查看次数: |
3933 次 |
| 最近记录: |