第一种方法
遍历groupby中的每一个组,将group对象(元组)的第二个元素取出来存为dataframe对象进行操作。注意,在循环中直接对group进行修改是不会更改groupby后的对象的。
df = pd.DataFrame({'A': 'a a b b b'.split(), 'B': [1, 2, 1, 2, 3], 'C': [4, 6, 5, 6, 7]})
print(df)
df = df.groupby(['A'])
f = lambda x: pd.Series([x.B + x.C, x.C - x.B], index=['D', 'F'])
for group in df:
print(group)
df1 = group[1] # 取出第二个元素
print(df1)
df1[['D', 'F']] = df1.apply(f, axis=1)
print(df1)
输出结果为
A B C
0 a 1 4
1 a 2 6
2 b 1 5
3 b 2 6
4 b 3 7
('a', A B C
0 a 1 4
1 a 2 6)
A B C
0 a 1 4
1 a 2 6
A B C D F
0 a 1 4 5 3
1 a 2 6 8 4
('b', A B C
2 b 1 5
3 b 2 6
4 b 3 7)
A B C
2 b 1 5
3 b 2 6
4 b 3 7
A B C D F
2 b 1 5 6 4
3 b 2 6 8 4
4 b 3 7 10 4
第二种方法
将dataframe进行groupby后转换成字典,然后对字典进行取值,之后对dataframe对象进行操作。这种方法可以对字典进行修改。
df = pd.DataFrame({'A': 'a a b b b'.split(), 'B': [1, 2, 1, 2, 3], 'C': [4, 6, 5, 6, 7]})
print(df)
dict_df = dict(list(df.groupby('A')))
print(dict_df)
a = dict_df['a']
print("print a")
print(a)
a_B = dict_df['a']['B']
print("print a_B")
print(a_B)
f = lambda x: pd.Series([x.B + x.C, x.C - x.B], index=['D', 'F'])
a[['D', 'F']] = a.apply(f, axis=1)
print("print a")
print(a)
# 在原字典中键‘a’的值里添加一列
dict_df['a'].loc[:, 'D'] = 0
print('print dict_df[''a'']')
print(dict_df['a'])
输出结果为
A B C
0 a 1 4
1 a 2 6
2 b 1 5
3 b 2 6
4 b 3 7
{'a': A B C
0 a 1 4
1 a 2 6, 'b': A B C
2 b 1 5
3 b 2 6
4 b 3 7}
print a
A B C
0 a 1 4
1 a 2 6
print a_B
0 1
1 2
Name: B, dtype: int64
print a
A B C D F
0 a 1 4 5 3
1 a 2 6 8 4
print dict_df[a]
A B C D
0 a 1 4 0
1 a 2 6 0
对比分析一下,第二种方法需要清楚的知道分组键是什么,才能进行调用,如果分组键比较多且需要对所有的分组都进行同样的操作的话,第一种方法比较快捷。然而,如果是想直接对groupby后的内容进行修改的话,第二种方法比较好。