python处理NaN以及数据处理相关问题

NaN 我太难了

1巧用nan的填充函数fillna()

NaN真的太难处理了,这两天在做o2o的题目,但是o2o给的优惠券是str的形式啊,如果不把NaN转化成null就没法做,但是如果全都转了,时间转换那边也不行,然后我就想到关于NaN的有一个处理函数叫做fillna()
这个函数就是说如果你可以把NaN填充成任意你想填充的数据。例如o2o当中对优惠券处理部分。
在这里插入图片描述
可以看到既有NaN数据又有那种比例的数据,所以我就想把优惠率转成float形式,这边参考了点别人的代码

def processData(df):
    df['distance']= df['Distance'].fillna(-1)  #这边就是把所有的数据含有NaN的都变成-1
    print('i',df['distance'].unique())
    df['discount_rate'] = df['Discount_rate'].fillna('null')
    df['discount_rate'] = df['discount_rate'].apply(convertRate)
    print(df['discount_rate'].unique())
    return df
       
def convertRate(row):
    """Convert discount to rate"""
    if row == 'null':
        return 1.0
    elif ':' in row:
        rows = row.split(':')
        return 1.0 - float(rows[1])/float(rows[0])
    else:
        return float(row)

在这里插入图片描述

2.巧用isnull() 和notnull() 进行NaN的统计

但是如果不是优惠率这么复杂的情况的话。还可以用isnull()和notnull()进行数据统计或者比较等等

2.1 数据读取

dfoff = pd.read_csv(’/kaggle/input/ccf_offline_stage1_train.csv’)

2.2 那么pandas怎么处理NaN数据呢?

这边有isnull和notnull:
有一篇教程曾经给出
这边isnull()是判断是不是NaN值,后面还可以跟上sum()解雇跟上面的一样
对于NaN还有其他的处理 例如fillna() dropna()之类的

print('有优惠券 没买',((dfoff['Coupon_id'].notnull())&(dfoff['Date'].isnull())).sum())
print('有优惠券 买了',((dfoff['Coupon_id'].notnull())&(dfoff['Date'].notnull())).sum())
print('没优惠券 没买',((dfoff['Coupon_id'].isnull())&(dfoff['Date'].isnull())).sum())
print('没优惠券 买了',((dfoff['Coupon_id'].isnull())&(dfoff['Date'].notnull())).sum())

在这里插入图片描述

3. 传说中的isnan()

这玩意也是判断是不是NaN的 返回的是个布尔值
但是用起来要先import math

import math 
#df['discount_rate'] = df['Discount_rate'].fillna('null')  #fillna替换成以下
df['distance']= df['Distance'].apply(replacenan)

def replacenan(row):
    if math.isnan(row):
        return -1.0
    else:
        return row

感觉像是有病啊,写这么多明明一个单词解决,但我那会竟然突然想不到fillna(),这篇也记录我的成(chun)长(ben)吧 = =

4. 经常想查看下在某个数组里的数是否在另一个数组里出现,这个时候可以用set

# 在测试集中出现的用户但训练集没有出现 set不重复且无序
print('1. User_id in training set but not in test set', set(dftest['User_id']) - set(dfoff['User_id'])) #看结果一共两条是不一样的 其他都是一样的
# 在测试集中出现的商户但训练集没有出现
print('2. Merchant_id in training set but not in test set', set(dftest['Merchant_id']) - set(dfoff['Merchant_id'])) # 看结果只有一条不一样

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值