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

系统 4656 0

     在使用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

这个图看起来比较丑,因为天数比较多,所以横坐标密密麻麻

 image.png  

我们看下提前预定天数和每个预定天数的产品的情况

 avg_days_befor.head()

 

 image.png  

看下分布情况

#观察下提前预定天数的分布
avg_days_befor.describe()

从下面表格可以看出,提前预定天数在0-633之间,75%的分布在200以内

 indexavg_days_befor
count259.000000259.000000
mean139.382239485.555985
std97.0807851240.626948
min0.0000001.000000
25%64.5000002.000000
50%129.00000017.000000
75%194.500000180.000000
max633.00000010273.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

 

 image.png  

可以看出,结果已经更改到原来的数据集上了。

那么,如果我们直接执行语句,不复写原来的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是不会有任何改变的

 image.png  


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论