1. 程式人生 > >DataFrame.apply與GroupBy.apply的用法

DataFrame.apply與GroupBy.apply的用法

DataFrame.apply的用法

DataFrame.apply操作的物件是DataFrame的一行或者一列,通過axis來指定行或者列,最終返回的型別取決於apply函式操作的結果。

對行進行操作

新增新行

df = pd.DataFrame({'A': [1, 1, 1, 1, 2, 2, 3, 3], 'B': np.arange(8), 'C': [4, 1, 2, 1, 6, 3, 9, 0]})
print(df)
f = lambda x: x['A'] + x['B'] + x['C']
df['D'] = df.apply(f, axis=1)
print
(df)

輸出結果

   A  B  C
0  1  0  4
1  1  1  1
2  1  2  2
3  1  3  1
4  2  4  6
5  2  5  3
6  3  6  9
7  3  7  0

   A  B  C   D
0  1  0  4   5
1  1  1  1   3
2  1  2  2   5
3  1  3  1   5
4  2  4  6  12
5  2  5  3  10
6  3  6  9  18
7  3  7  0  10

同時新增兩行

df = pd.DataFrame({'A': 'a a b'.split(), 'B': [
1, 2, 3], 'C': [4, 6, 5]}) print(df) f = lambda x: pd.Series([x.B + x.C, x.C - x.B], index=['D', 'F']) df[['D', 'F']] = df.apply(f, axis=1) print(df)

輸出結果

   A  B  C
0  a  1  4
1  a  2  6
2  b  3  5

   A  B  C  D  F
0  a  1  4  5  3
1  a  2  6  8  4
2  b  3  5  8  2
對列進行操作

統計列的和

df = pd.DataFrame(
{'A': [1, 1, 1, 1, 2, 2, 3, 3], 'B': np.arange(8), 'C': [4, 1, 2, 1, 6, 3, 9, 0]}) print(df) df = df.apply(np.sum, axis=0) print(df)

輸出結果

   A  B  C
0  1  0  4
1  1  1  1
2  1  2  2
3  1  3  1
4  2  4  6
5  2  5  3
6  3  6  9
7  3  7  0

A    14
B    28
C    26

GroupBy.apply的用法

GroupBy.apply是將一個(已經分過組的)dataframe作為輸入,對每個group進行操作後,將結果整合為一個dataframe或者series或者標量返回。

對元素進行操作

求每組元素佔每組列元素之和的比值

df = pd.DataFrame({'A': 'a a b'.split(), 'B': [1, 2, 3], 'C': [4, 6, 5]})
print(df)
g = df.groupby('A')
g = g.apply(lambda x: x / x.sum())
print(g)

返回的是DataFrame物件,輸出結果

   A  B  C
0  a  1  4
1  a  2  6
2  b  3  5

          B    C
0  0.333333  0.4
1  0.666667  0.6
2  1.000000  1.0
對每組各列進行操作

每組每列元素最大值減最小值

df = pd.DataFrame({'A': 'a a b'.split(), 'B': [1, 2, 3], 'C': [4, 6, 5]})
print(df)
g = df.groupby('A')
g = g.apply(lambda x: x.max() - x.min())
print(g)

返回的是DataFrame物件,輸出結果

   A  B  C
0  a  1  4
1  a  2  6
2  b  3  5

   B  C
A      
a  1  2
b  0  0
對每組指定列進行操作

每組某列元素最大值減某列元素最小值

df = pd.DataFrame({'A': 'a a b'.split(), 'B': [1, 2, 3], 'C': [4, 6, 5]})
print(df)
g = df.groupby('A')
g = g.apply(lambda x: x.C.max() - x.B.min())
print(g)

返回的是Series物件,輸出結果

   A  B  C
0  a  1  4
1  a  2  6
2  b  3  5

A
a    5
b    2