Pandas常用操作 - 新增数据列
初始化测试数据
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
,key为需要增加的列,value为回调函数或者 Series
,即 df.assign(k1=Series1, k2=Series2)
的形式。
所以在上例中,计算需要的 label
,则需要写成:
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
不能直接写成
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().