请考虑以下与Pandas' Group By Tutorial非常相似的数据:
import pandas as pd
import numpy as np
df = pd.DataFrame({'Week' : [1, 2, 1, 2,
1, 2, 1, 1],
'BloodType' : ['A+', 'AB', 'AB', 'B',
'B', 'B+', 'AB', 'AB'],
'C' : np.random.randn(8),
'D' : np.random.randn(8)})
这将产生一个DataFrame
,如下所示:
我想按"Week"
分组,然后仅对列C
和D
进行一些操作。所以我尝试了:
week_group = df.groupby('Week')
week_group.apply(lambda x: x.drop(["BloodType", "Week"], 1))
最初,我解释为DataFrame
和"BloodType"
列中的每"Week"
滴,然后将结果分组给我。但是,它给了我
但是,我希望它能给我一个Group
,其中每个索引都是一个DataFrame
,只有列C
和D
。我没想到有DataFrame
。
我尝试用apply
和transform
淘汰agg
,这给出了:
ValueError: transform must return a scalar value for each group
和:
ValueError: cannot copy sequence with size 2 to array axis with dimension 5
分别。是否有一个相对简单的转换,可以按名称DataFrame
中的每个Group
删除行,并返回生成的Group
对象(或就地执行操作)?
答案 0 :(得分:2)
基于CJ59的回答,我想到了这个简洁的解决方案:
week_group = week_group[df.columns.difference(["Week", "BloodType"])]
答案 1 :(得分:0)
您可能正在搜索
for name, group in df.groupby('Week'):
print(name, group.drop(columns=['Week', 'BloodType']))
1 C D
0 0.496714 -0.469474
2 0.647689 -0.463418
4 -0.234153 0.241962
6 1.579213 -1.724918
7 0.767435 -0.562288
2 C D
1 -0.138264 0.54256
3 1.523030 -0.46573
5 -0.234137 -1.91328