Loading

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().



posted @ 2021-06-06 17:27  Convict  阅读(788)  评论(0编辑  收藏  举报