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