DataFrame.apply與GroupBy.apply的用法
阿新 • • 發佈:2018-11-12
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