【问题标题】:Pandas groupby with None熊猫 groupby 与 None
【发布时间】:2019-02-28 02:26:48
【问题描述】:

对于一个数据框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 克林顿比尔 1 1 克林顿威廉 2 南克林顿比尔 3 南克林顿威廉 4 1 NaN 无 5 2 布什乔治 W. 6 2 布什乔治 7 3 NaN 无 8 NaN 奥巴马巴拉克 9 4 奥巴马巴拉克

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

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

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

有什么优雅的想法吗?

【问题讨论】:

  • 我相信事情是:仅当组大小为 >1 时才删除 NaNs。但是你不能一开始就将它们组合在一起,所以不要认为可以这样做。你有那些NaN有什么理由吗?也许问题在于构建数据框
  • 感谢@RafaelC 这正是问题所在。
  • 迈克尔,我尝试了一个解决方案。假设您有一个“排序”的数据框,它应该可以工作。看看

标签: pandas pandas-groupby


【解决方案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

【讨论】:

    猜你喜欢
    • 2021-07-16
    • 2022-07-05
    • 2018-04-23
    • 2022-12-16
    • 2019-02-24
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多