【问题标题】:Split DataFrame and loop functions over subframes在子帧上拆分 DataFrame 和循环函数
【发布时间】:2021-11-09 10:11:40
【问题描述】:

我有一个具有以下结构的数据框:

df = pd.DataFrame({'TIME':list('12121212'),'NAME':list('aabbccdd'), 'CLASS':list("AAAABBBB"),
               'GRADE':[4,5,4,5,4,5,4,5]}, columns = ['TIME', 'NAME', 'CLASS','GRADE'])
print(df):
  TIME NAME CLASS  GRADE
0    1    a     A      4
1    2    a     A      5
2    1    b     A      4
3    2    b     A      5
4    1    c     B      4
5    2    c     B      5
6    1    d     B      4
7    2    d     B      5

我需要做的是根据变量CLASS将上面的dataframe分割成多个dataframe,将dataframe从long转换为wide(这样我们就有了NAMES 作为列,GRADE 作为数据矩阵中的主条目),然后在较小的 CLASS 数据帧上迭代其他函数。如果我按照here 的建议创建一个dict 对象,我会得到:

d = dict(tuple(df.groupby('CLASS')))
print(d):
{'A':   TIME NAME CLASS  GRADE
0    1    a     A      4
1    2    a     A      5
2    1    b     A      4
3    2    b     A      5, 'B':   TIME NAME CLASS  GRADE
4    1    c     B      4
5    2    c     B      5
6    1    d     B      4
7    2    d     B      5}

为了将数据帧从长转换为宽,我使用了来自pandas的函数pivot_table

for names, classes in d.items():
    newdata=df.pivot_table(index="TIME", columns="NAME", values="GRADE")
print(newdata):
NAME  a  b  c  d
TIME
1     4  4  4  4
2     5  5  5  5

到目前为止一切顺利。但是,一旦我获得了newdata 数据框,我就无法访问在d 中创建的较小数据框,因为变量CLASS 现在从数据框中丢失(应该如此)。假设我需要在两个较小的子帧CLASS==ACLASS==B 上迭代一个函数。如果我无法使用列 CLASS 定义数据集结构,我将如何使用 for 循环来执行此操作?

【问题讨论】:

  • newdata 你在for循环外打印,如果你缩进它并在循环内打印,你应该得到每个类的单独数据帧
  • 请修剪您的代码,以便更容易找到您的问题。请按照以下指南创建minimal reproducible example

标签: python dataframe loops dictionary


【解决方案1】:

尝试使用groupby+apply 来保留组名:

(df.groupby('CLASS')
   .apply(lambda d: d.pivot_table(index="TIME", columns="NAME", values="GRADE"))
)

输出:

              a    b    c    d
CLASS TIME                    
A     1     4.0  4.0  NaN  NaN
      2     5.0  5.0  NaN  NaN
B     1     NaN  NaN  4.0  4.0
      2     NaN  NaN  5.0  5.0

其他可能性,遍历组,保持 CLASS 作为列:

for group_name, group_df in df.groupby('CLASS', as_index=False):
    print(f'working on group {group_name}')
    print(group_df)

输出:

working on group A
  TIME NAME CLASS  GRADE
0    1    a     A      4
1    2    a     A      5
2    1    b     A      4
3    2    b     A      5
working on group B
  TIME NAME CLASS  GRADE
4    1    c     B      4
5    2    c     B      5
6    1    d     B      4
7    2    d     B      5

【讨论】:

  • 这似乎是我很好的解决方案!不过,我如何能够在子组上循环函数?有没有办法自己检索数据集 A 和 B?
  • @MichaelJ.Erickson apply 使您能够运行任何将数据框作为输入的函数。另外,使用循环检查我的更新以获取解决方案
猜你喜欢
  • 2021-01-25
  • 2021-11-08
  • 1970-01-01
  • 2022-12-15
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
相关资源
最近更新 更多