在数据的预处理中依据关键字的不同来进行分组是一种常见方法,而pandas中内置了这一方法
来看这个示例
import pandas as pd
df = pd.DataFrame({'A':['bob','sos','bob','sos','bob','sos','bob','bob'],
'B':['one','one','two','three','two','two','one','three'],
'C':[3,1,4,1,5,9,2,6],
'D':[1,2,3,4,5,6,7,8]})
grouped = df.groupby('A')
for name,group in grouped:
print(name)
print(group)
d = grouped.apply(lambda x:x.head(2))
df是一个普通的DataFrame对象
A B C D
0 bob one 3 1
1 sos one 1 2
2 bob two 4 3
3 sos three 1 4
4 bob two 5 5
5 sos two 9 6
6 bob one 2 7
7 bob three 6 8
使用语句grouped = df.groupby('A')
,将df按照A的索引进行了分组,展示结果如下
bob
A B C D
0 bob one 3 1
2 bob two 4 3
4 bob two 5 5
6 bob one 2 7
7 bob three 6 8
sos
A B C D
1 sos one 1 2
3 sos three 1 4
5 sos two 9 6
在DataFrame对象后可继续使用apply方法对它更方便地运用一些函数,例如d = grouped.apply(lambda x:x.head(2))
这里有一个lambda函数,其实lambda函数就是一个匿名函数,没有什么特别的
在调用某对象的apply方法时,其实就是把这个对象当作参数传入到后面的匿名函数中
继续看上面的例子
import pandas as pd
df = pd.DataFrame({'A':['bob','sos','bob','sos','bob','sos','bob','bob'],
'B':['one','one','two','three','two','two','one','three'],
'C':[3,1,4,1,5,9,2,6],
'D':[1,2,3,4,5,6,7,8]})
grouped = df.groupby('A')
print(df)
for name,group in grouped:
print(name)
print(group)
d = grouped.apply(lambda x:x.head(2))
print('apply后')
print(d)
结果为
A B C D
0 bob one 3 1
1 sos one 1 2
2 bob two 4 3
3 sos three 1 4
4 bob two 5 5
5 sos two 9 6
6 bob one 2 7
7 bob three 6 8
bob
A B C D
0 bob one 3 1
2 bob two 4 3
4 bob two 5 5
6 bob one 2 7
7 bob three 6 8
sos
A B C D
1 sos one 1 2
3 sos three 1 4
5 sos two 9 6
apply后
A B C D
A
bob 0 bob one 3 1
2 bob two 4 3
sos 1 sos one 1 2
3 sos three 1 4