Python之DataFrame按照规则批量修改某列的数据

匿名 (未验证) 提交于 2019-12-02 22:51:30

以下数据是某个产品的提前预定期:

 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是不会有任何改变的

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!