迭代 Pandas 分组数据框

Posted

技术标签:

【中文标题】迭代 Pandas 分组数据框【英文标题】:Iterating over a Pandas grouped dataframe 【发布时间】:2017-01-04 23:04:01 【问题描述】:

我在pandas 中使用groupby 来创建一些json 样式数据。我无法遍历分组的 dataframe,因为它无法识别我的密钥

import pandas as pd


df = pd.DataFrame(data=[['Group A', 10],
                       ['Group A', 12],
                       ['Group B', 22],
                       ['Group B', 25],
                       ['Group B', 26]],
                  columns = ['Group', 'Value'])

df = df.groupby('Group').agg(['mean', 'count']).reset_index()

json_data = ['id': row['Group'],
              'name': row['Group'],
              'value': row['mean'] for index, row in df.iteritems()]
print json_data

错误:

KeyError: 'Group'

期望的输出:

[
    'id': 'Group A',
    'name': 'Group A',
    'value': 11
, 
    'id': 'Group B',
    'name': 'Group B',
    'value': 24.33333
    ]

【问题讨论】:

【参考方案1】:

作为documented,iteritems 迭代列(特别是名称/列对)。看起来你想要iterrows。 (您仍然需要将其更改为访问 ['Value', 'mean'] 而不是 ['mean'],因为您创建了一个包含多索引列的 DataFrame。)

【讨论】:

谢谢,我不知道如何引用'mean'。意思是['Value', 'mean'],但是Group列没有标签,怎么引用的? @user2242044:“没有标签”是什么意思? “组”列可以直接使用 ["Group"] 访问,因为它没有额外的索引级别。 @BrenBam,使用row['Group'] 似乎正在添加整个数据框` Group A Name: 0, dtype: object,` @user2242044:啊,你说得对。你必须做row['Group', '']【参考方案2】:

试试这个:这是DataFrame.to_json()的链接

df = df.groupby('Group').mean().reset_index().rename(columns = 'Group':"id" )
df['name'] = df['id']
df.to_json(orient="records")

'["id":"Group A","Value":11.0,"name":"Group A","id":"Group B","Value":24.3333333333,"name":"Group B"]'

您可以通过这种方式重新排序 JSON 输出:

df[['id','name', 'Value', ]].to_json(orient="records")

'["id":"Group A","name":"Group A","Value":11.0,"id":"Group B","name":"Group B","Value":24.3333333333]'

【讨论】:

以上是关于迭代 Pandas 分组数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python Pandas 中扩展存储为单个值的可迭代对象? (又名反向分组)[重复]

如何有效地迭代 Pandas 数据帧的连续块

如何在迭代 pandas 分组 df 时修复 ValueError?

迭代列表以创建数据框输出 Pandas

迭代 Pandas 数据框的最佳方法?

迭代 Pandas 数据框上的唯一日期