groupby

在数据的预处理中依据关键字的不同来进行分组是一种常见方法,而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

apply

在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

参考资料