Pandas中的groupby函数使用None

11

针对一个数据框 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
我认为问题是:仅在组大小>1时删除NaN。但是,首先不能将它们全部分组在一起,因此不认为可以这样做。您是否有任何原因需要这些NaN?也许问题出在构建数据框上。 - rafaelc
感谢 @RafaelC,那正是问题所在。 - Michael Dorner
迈克尔,我尝试了一个解决方案。假设你有一个“已排序”的数据框,它应该可以工作。看一下。 - rafaelc
我也遇到了这个问题,于是决定在进行分组操作之前执行df["id"] = df["id"].fillna("None")。然后Groupby会将"None"考虑在内,因为它似乎只是像其他所有列值一样的一个列值。 - Sander Vanden Hautte
1个回答

5

如果我理解正确,假设您的数据框结构类似于您发布的结构,您可以使用 ffill() 并按其分组,然后仅在每个分组的 len 大于 1 时才dropna

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接