下面是关于Pandas对DataFrame单列/多列进行运算的攻略:
DataFrame单列运算
map()
: 对DataFrame中的某一列进行逐元素操作,返回映射后的结果。该方法可以接收一个字典、Series、函数等类型作为映射方式,其中字典和Series的索引为原DataFrame的列名,字典或Series的值为进行操作后的结果。
示例一:定义一个DataFrame,对其中一列成绩进行映射,将数值转换为字母成绩。
import pandas as pd
data = {'Name':['Tom', 'Jack', 'Mary'], 'Score':[65, 90, 78]}
df = pd.DataFrame(data)
grade_map = {100: 'A+', 90: 'A', 80: 'B', 70: 'C', 60: 'D', 0: 'F'}
df['Grade'] = df['Score'].map(lambda x: next((v for k, v in grade_map.items() if x >= k), 'F'))
print(df)
运行结果:
Name Score Grade
0 Tom 65 D
1 Jack 90 A
2 Mary 78 C
示例二:定义一个DataFrame,将其中一列数值四舍五入保留两位小数。
import pandas as pd
data = {'Name':['Tom', 'Jack', 'Mary'], 'Height':[1.75, 1.80, 1.67]}
df = pd.DataFrame(data)
df['Height'] = df['Height'].map(lambda x: round(x, 2))
print(df)
运行结果:
Name Height
0 Tom 1.75
1 Jack 1.80
2 Mary 1.67
apply()
: 对DataFrame中的某一列逐行进行操作,返回处理后的Series。该方法需要传入一个函数作为操作方式。
示例三:定义一个DataFrame,对其中一列字符串转换为大写格式。
import pandas as pd
data = {'Name':['tom', 'Jack', 'Mary'], 'Age':[25, 30, 28]}
df = pd.DataFrame(data)
df['Name'] = df['Name'].apply(lambda x: x.upper())
print(df)
运行结果:
Name Age
0 TOM 25
1 JACK 30
2 MARY 28
DataFrame多列运算
apply()
和lambda
函数:
apply()方法在传入的操作函数中会以列为单位进行操作,所以该操作函数中其实是序列操作,而不是单纯的整体列运算。
示例四:定义一个DataFrame,对其中两列元素求和。
import pandas as pd
data = {'Name':['Tom', 'Jack', 'Mary'], 'Score':[65, 90, 78], 'Age':[25, 30, 28]}
df = pd.DataFrame(data)
df['Score-Age'] = df.apply(lambda x: x['Score'] + x['Age'], axis=1)
print(df)
运行结果:
Name Score Age Score-Age
0 Tom 65 25 90
1 Jack 90 30 120
2 Mary 78 28 106
agg()
: 对DataFrame进行列统计分析,可以一次性对多个列进行运算,并返回结果。该方法可以接收多个操作函数,其中每个操作函数应当为单个列元素进行操作。
示例五:定义一个DataFrame,对其中两列元素进行最大值、最小值和平均值的统计。
import pandas as pd
data = {'Name':['Tom', 'Jack', 'Mary'], 'Score':[65, 90, 78], 'Age':[25, 30, 28]}
df = pd.DataFrame(data)
res = df[['Score', 'Age']].agg(['max', 'min', 'mean'])
print(res)
运行结果:
Score Age
max 90.0 30.0
min 65.0 25.0
mean 77.6 27.7