文章目录
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'])) # 看结果只有一条不一样