在使用Python进行数据分析时,我们经常会看一个数据的分布,然后对数据进行处理。比如说有一个场景:
以下数据是某个产品的提前预定期:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import seaborn as sns import numpy as np %matplotlib inline data = (pd.read_csv('D:/Users/Merchants_portrait.csv')).astype('int') avg_days_befor = (data['avg_days_befor'].value_counts()).reset_index() sns.barplot(x = avg_days_befor.index, y = avg_days_befor['avg_days_befor']) plt.show() # 图3
这个图看起来比较丑,因为天数比较多,所以横坐标密密麻麻
我们看下提前预定天数和每个预定天数的产品的情况
avg_days_befor.head()
看下分布情况
#观察下提前预定天数的分布 avg_days_befor.describe()
从下面表格可以看出,提前预定天数在0-633之间,75%的分布在200以内
index | avg_days_befor | |
---|---|---|
count | 259.000000 | 259.000000 |
mean | 139.382239 | 485.555985 |
std | 97.080785 | 1240.626948 |
min | 0.000000 | 1.000000 |
25% | 64.500000 | 2.000000 |
50% | 129.000000 | 17.000000 |
75% | 194.500000 | 180.000000 |
max | 633.000000 | 10273.000000 |
根据上面的分析,假如我们想把提前预定天数改为阶段分布,我们可以按照如下来做:
我们先定义一个预定天数重写的函数,然后使用lambda函数应用在那一列上,并且把结果更新到原来数据的该列上,如果不重写到原来的数据上,那么原dataframe不会变
#对于提前预定天数重写 def fun_avg_days_befor(x): if x <= 7: return 1 elif x > 7 and x <= 14: return 2 elif x > 14 and x <= 21: return 3 elif x > 21 and x <= 28: return 4 elif x > 28 and x <= 35: return 5 elif x > 35 and x <= 42: return 6 elif x > 42 and x <= 49: return 7 elif x > 49 and x <= 56: return 8 elif x > 56 and x <= 63: return 9 else: return 10 #将数据生效在原dataframe上 data['avg_days_befor'] = data['avg_days_befor'].apply(lambda x:fun_avg_days_befor(x)) avg_days_befor = (data['avg_days_befor'].value_counts()).reset_index()
我们先看下改变后的结果:
sns.barplot(x = avg_days_befor.index, y = avg_days_befor['avg_days_befor']) plt.show() # 图3
可以看出,结果已经更改到原来的数据集上了。
那么,如果我们直接执行语句,不复写原来的dataframe呢?我们看下结果
#对于提前预定天数重写 def fun_avg_days_befor(x): if x <= 7: return 1 elif x > 7 and x <= 14: return 2 elif x > 14 and x <= 21: return 3 elif x > 21 and x <= 28: return 4 elif x > 28 and x <= 35: return 5 elif x > 35 and x <= 42: return 6 elif x > 42 and x <= 49: return 7 elif x > 49 and x <= 56: return 8 elif x > 56 and x <= 63: return 9 else: return 10 data['avg_days_befor'].apply(lambda x:fun_avg_days_befor(x))
从下面结果可以看出,他只是个简单结果,再查看原来的dataframe是不会有任何改变的
本文为张军原创文章,转载无需和我联系,但请注明来自张军的军军小站,个人博客http://www.zhangjunbk.com