pandas 数据处理遇到的问题

数据为DataFrame格式,如下:

1.对每一行,FirstCab的值为空时,Weight的值乘以0.8

方法一(可行):df.loc[df['FirstCab'].isnull(),'Weight'] *= 0.8

方法二(可行):df['Weight'] = np.where(df['FirstCab'].isnull(),df['Weight']*0.8,df['Weight'])

方法三(不可行):df[df['FirstCab'].isnull()]['Weight']  *= 0.8 或者 df.loc[df['FirstCab'].isnull(),:]['Weight']  *= 0.8

错误提示:A value is trying to be set on a copy of a slice from a DataFrame.Try using .loc[row_indexer,col_indexer] = value instead.

方法四(不可行):df.assign(Weight=lambda x: x['Weight']*0.8 if x['FirstCab'].isnull() else x['Weight'])

        或者df.assign(Weight=lambda x: x['Weight']*0.8 if x['FirstCab'] == np.nan else x['Weight'])

错误提示:ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

 2.提取Ticket列末尾的数字,之后需要比较大小

Ticket列的值如:A/5. 2151 或者PP 9549 或者 333223或者LINE,提取末尾的数字,没有则返回NaN

方法一(可行):df['NumTic']= df['Ticket'].str.extract('(\d{3,8})',expand=False).astype(float)

方法二(不可行): df['NumTic']= df['Ticket'].str.extract('(\d{3,8})',expand=False)

错误提示: 保存的是字符型值,在比较大小或加减运算时出错

方法三(不可行):df['NumTic']= df['Ticket'].str.extract('(\d{3,8})',expand=False).astype(int)

错误提示:NaN不能转换为int型

3.对索引赋值是报错ValueError: Length mismatch: Expected axis has 678 elements, new values have 677 elements

代码如下:

attrValues = df['NumTic'].sort_values()
#去重
attrValues = attrValues.drop_duplicates()
#修改index
attrValues.index = range(attrValues.count()) ###出错在这里

原因:attrValues中有一个NaN值, attrValues.count()不统计NaN值,所以attrValues.index的个数,比attrValues.count()大1

解决办法:

在首行代码中去掉df中的NaN值行,即attrValues = df[df['NumTic'].notnull()].NumTic.sort_values()。

 

转载于:https://www.cnblogs.com/zhengyyao/p/7507936.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值