使用 groupby 创建新的数据框

Posted

技术标签:

【中文标题】使用 groupby 创建新的数据框【英文标题】:Creating new dataframes using groupby 【发布时间】:2018-12-08 00:49:56 【问题描述】:

我读过这篇文章 (How to create multiple dataframes from pandas groupby object),但是,在我使用 groupby 创建 grouped_persons 组后,我仍然不明白如何为每个人创建我的数据框。

How to create multiple dataframes from pandas groupby object

我应该在此代码中进行哪些更改? 我认为这是我的问题的一部分:'df_'+ name +'1'

grouped_persons = df.groupby('Person')
for name, group in grouped_persons
    'df_'+ name +'1' = df.loc[(df.Person == name) & (df.ExpNum == 1)]

文件“”,第 2 行 对于姓名,分组为 grouped_persons ^ SyntaxError: 无效语法

【问题讨论】:

【参考方案1】:

对可变数量的变量使用字典。

一个简单的解决方案是使用代表('Person', 'ExpNum') 组合的tuple 键。您可以通过将groupby 对象提供给tuple,然后将结果提供给dict 来实现此目的。

来自@KayWittig 的数据。

df = pd.DataFrame([['Tim', 1, 2], ['Tim', 0, 2],
                   ['Claes', 1, 3], ['Claes', 0, 1],
                   ['Emma', 1, 1], ['Emma', 1, 2]],
                  columns=['Person', 'ExpNum', 'Data'])

df_dict = dict(tuple(df.groupby(['Person', 'ExpNum'])))

print(df_dict)

('Claes', 0):   Person  ExpNum  Data
               3  Claes       0     1,
 ('Claes', 1):   Person  ExpNum  Data
               2  Claes       1     3,
 ('Emma', 1):   Person  ExpNum  Data
               4   Emma       1     1
               5   Emma       1     2,
 ('Tim', 0):   Person  ExpNum  Data
               1    Tim       0     2,
 ('Tim', 1):   Person  ExpNum  Data
               0    Tim       1     2

【讨论】:

【参考方案2】:

让你的 DataFrame 看起来像这样

df = pd.DataFrame([['Tim', 1, 2],
                   ['Tim', 0, 2],
                   ['Claes', 1, 3],
                   ['Claes', 0, 1],
                   ['Emma', 1, 1],
                   ['Emma', 1, 2]], columns=['Person', 'ExpNum', 'Data'])

给予

>>> df
  Person  ExpNum  Data
0    Tim       1     2
1    Tim       0     2
2  Claes       1     3
3  Claes       0     1
4   Emma       1     1
5   Emma       1     2

然后您将直接从 pandas groupby 对象中获取组数据帧

grouped_persons = df.groupby('Person')

通过

>>> grouped_persons.get_group('Emma')
  Person  ExpNum  Data
4   Emma       1     1
5   Emma       1     2

而且不需要单独存放。

注意:使用的 Pandas 版本为 '0.23.1',但此功能可能在某些早期版本中也可用。

编辑:如果您只对带有 ExpNum == 1 的条目感兴趣,我建议在 groupby 之前应用它,例如

grouped_persons_1 = df[df['ExpNum'] == 1].groupby('Person')

【讨论】:

【参考方案3】:

您可以将它存储在这样的字典中。我也更正了您代码中的一些语法错误。

    grouped_persons = df.groupby('Person')
    multi_df = 
    for name, group in grouped_persons:
       multi_df['df_'+ name +'1'] = df[(df.Person == name) & (df.ExpNum == 1)]

现在您可以使用 multi_df['df_myname_1'] 取回存储的数据帧

【讨论】:

以上是关于使用 groupby 创建新的数据框的主要内容,如果未能解决你的问题,请参考以下文章

Pandas Groupby结果到一个单独的数据框中

将 groupby 平均统计数据映射为 pandas 中的新列

如何访问数据框的(多)索引?

创建由 Groupby 和转换产生的数据框列

从 Pandas Groupby 数据框创建等高线图

带有 MultiIndexing 的 Pandas 数据框中的 Groupby