初始化測試數據
df = pd.DataFrame({'stu_name': ['Nancy', 'Tony', 'Tim', 'Jack', 'Lucy'], 'stu_age': [17, 16, 16, 21, 19]})
stu_name stu_age
0 Nancy 17
1 Tony 16
2 Tim 16
3 Jack 21
4 Lucy 19
1. 直接增加一列
df['new_column'] = '-'
stu_name stu_age new_column
0 Nancy 17 -
1 Tony 16 -
2 Tim 16 -
3 Jack 21 -
4 Lucy 19 -
2. apply方法
def cal_label(age):
if age > 18:
return '成年'
else:
return '未成年'
df['label'] = df['stu_age'].apply(cal_label)
stu_name stu_age label
0 Nancy 17 未成年
1 Tony 16 未成年
2 Tim 16 未成年
3 Jack 21 成年
4 Lucy 19 成年
apply
方法中也可以運用 lambda
表達式,使之更加簡潔
df['label'] = df['stu_age'].apply(lambda age: '成年' if age > 18 else '未成年')
stu_name stu_age label
0 Nancy 17 未成年
1 Tony 16 未成年
2 Tim 16 未成年
3 Jack 21 成年
4 Lucy 19 成年
3. loc方法
df.loc[:, 'label'] = df['stu_age'].apply(lambda age: '成年' if age > 18 else '未成年')
stu_name stu_age label
0 Nancy 17 未成年
1 Tony 16 未成年
2 Tim 16 未成年
3 Jack 21 成年
4 Lucy 19 成年
4. assign方法
new_df = df.assign(label=df['stu_age'].apply(lambda x: '成年' if x > 18 else '未成年'))
stu_name stu_age label
0 Nancy 17 未成年
1 Tony 16 未成年
2 Tim 16 未成年
3 Jack 21 成年
4 Lucy 19 成年
assign
方法中,傳遞的是 **kwargs
,值爲回調函數或者 Series
,即 df.assign(k1=[xxx], k2=[xxx])
的形式。
所以在上例中,計算 label
不能直接寫成:
不能直接寫成
new_df = df.assign(label=lambda x: '成年' if x['stu_age'] > 18 else '未成年')
此時會拋異常:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
而是需要寫成:
new_df = df.assign(label=df['stu_age'].apply(lambda x: '成年' if x > 18 else '未成年'))
因爲df['stu_age'].apply(lambda x: '成年' if x > 18 else '未成年')
返回的是Series