【问题标题】:Pandas Group by with dict valuesPandas Group by dict 值
【发布时间】:2021-10-04 00:30:03
【问题描述】:

我有一个包含以下数据的 DataFrame:

size                   col1                   col2
1.5    {'val':1.1, 'id': 10}                  None
2.0    {'val':1.1, 'id': 11}                  None
3.0    {'val':1.1, 'id': 20}                  None
3.0                     None   {'val':1.1, 'id': 6}

我正在尝试合并行并删除 None,但是当我执行任何 df.groupby(by=['size']).max() 或其他操作时,它会将 dict 值转换为 NaN。

有没有办法合并这些行并保留 dict 值?

预期结果:

size                   col1                   col2
1.5    {'val':1.1, 'id': 10}                  None
2.0    {'val':1.1, 'id': 11}                  None
3.0    {'val':1.1, 'id': 20}   {'val':1.1, 'id': 6}

共享size=3.0 的两行(或多行)被合并并保留列。

【问题讨论】:

  • 您的预期结果是什么?
  • 我已更新以添加预期结果,谢谢!

标签: python pandas dataframe pandas-groupby


【解决方案1】:

试试groupbyfirst

out = df.groupby('size').first()#.reset_index()

更新

out = df.replace({'None':np.nan}).groupby('size').first()#.reset_index()

【讨论】:

  • 谢谢,不幸的是,这只保留了col1 的值,而col2 设置为None。如果我没有 dict 值,则各种函数都可以工作,但在这种情况下我需要 dict 值。
  • @Zexelon 将替换为 None 添加到 NaN
【解决方案2】:

经过大量阅读和测试,看起来 pandas groupby agg 函数只能处理数值。任何非数字值都会被删除。

我的解决方案需要重新构建整个问题,新的数据格式是:

size    col                  value
1.5    col1  {'val':1.1, 'id': 10}
2.0    col1  {'val':1.1, 'id': 11}
3.0    col1  {'val':1.1, 'id': 20}
3.0    col2   {'val':1.1, 'id': 6}

通过这种新的数据格式,我可以使用:

df = df.pivot(index='size',columns='col', values='value')
df = df.reset_index()

使用 pivot 可以保留 dict 值,因为我能够控制此解决方案工作的日期格式。

【讨论】:

    猜你喜欢
    • 2018-10-28
    • 2018-03-05
    • 2023-01-15
    • 2023-01-13
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    相关资源
    最近更新 更多