【发布时间】: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==A 和CLASS==B 上迭代一个函数。如果我无法使用列 CLASS 定义数据集结构,我将如何使用 for 循环来执行此操作?
【问题讨论】:
-
newdata 你在for循环外打印,如果你缩进它并在循环内打印,你应该得到每个类的单独数据帧
-
请修剪您的代码,以便更容易找到您的问题。请按照以下指南创建minimal reproducible example。
标签: python dataframe loops dictionary