Python数据分析实战之分布分析
统计与数据分析实战
共 3328字,需浏览 7分钟
·
2020-09-12 15:26
◆ ◆ ◆ ◆ ◆
import pandas as pd
import matplotlib.pyplot as plt
import math
>>> df = pd.read_csv('UserInfo.csv')
>>> df.info()
RangeIndex: 1000000 entries, 0 to 999999
Data columns (total 4 columns):
UserId 1000000 non-null int64
CardId 1000000 non-null int64
LoginTime 1000000 non-null object
DeviceType 1000000 non-null object
dtypes: int64(2), object(2)
memory usage: 30.5+ MB
# 提取出生日期需要先把身份证号码转换成字符串
'CardId'] = df['CardId'].astype('str') > df[
# 提取出生日期,并生成新字段
'DateofBirth'] = df.CardId.apply(lambda x : x[6:10]+"-"+x[10:12]+"-"+x[12:14]) > df[
# 提取性别,待观察性别分布
'Gender'] = df['CardId'].map(lambda x : 'Male' if int(x[-2]) % 2 else 'Female') > df[
> df.head()
3.计算年龄
# 提取出生日期:月和日
>>> df[['month','day']] = df['DateofBirth'].str.split('-',expand=True).loc[:,1:2]
# 提取小月,查看是否有31号
>>> df_small_month = df[df['month'].isin(['02','04','06','09','11'])]
# 无效数据,如图所示
>>> df_small_month[df_small_month['day']=='31']
# 统统删除,均为无效数据
>>> df.drop(df_small_month[df_small_month['day']=='31'].index,inplace=True)
# 同理,校验2月
>>> df_2 = df[df['month']=='02']
# 2月份的校验大家可以做的仔细点儿,先判断是否润年再进行删减
>>> df_2[df_2['day'].isin(['29','30','31'])]
# 统统删除
>>> df.drop(df_2[df_2['day'].isin(['29','30','31'])].index,inplace=True)
# 计算年龄
# 方法一
'Age'] = df['DateofBirth'].apply(lambda x : math.floor((pd.datetime.now() - pd.to_datetime(x)).days/365)) df[
# 方法二
'DateofBirth'].apply(lambda x : pd.datetime.now().year - pd.to_datetime(x).year) df[
# 查看年龄区间,进行分区
>>> df['Age'].max(),df['Age'].min()
# (45, 18)
>>> bins = [0,18,25,30,35,40,100]
>>> labels = ['18岁及以下','19岁到25岁','26岁到30岁','31岁到35岁','36岁到40岁','41岁及以上']
>>> df['年龄分层'] = pd.cut(df['Age'],bins, labels = labels)
# 查看是否有重复值
>>> df.duplicated('UserId').sum() #47681
# 数据总条目
>>> df.count() #980954
>>> df.groupby('年龄分层')['UserId'].count()
年龄分层
18岁及以下 25262
19岁到25岁 254502
26岁到30岁 181751
31岁到35岁 181417
36岁到40岁 181589
41岁及以上 156433
Name: UserId, dtype: int64
# 通过求和,可知重复数据也被计算进去
>>> df.groupby('年龄分层')['UserId'].count().sum()
# 980954
>>> df.groupby('年龄分层')['UserId'].nunique()
年龄分层
18岁及以下 24014
19岁到25岁 242199
26岁到30岁 172832
31岁到35岁 172608
36岁到40岁 172804
41岁及以上 148816
Name: UserId, dtype: int64
>>> df.groupby('年龄分层')['UserId'].nunique().sum()
# 933273 = 980954(总)-47681(重复)
# 计算年龄分布
>>> result = df.groupby('年龄分层')['UserId'].nunique()/df.groupby('年龄分层')['UserId'].nunique().sum()
>>> result
# 结果
年龄分层
18岁及以下 0.025731
19岁到25岁 0.259516
26岁到30岁 0.185189
31岁到35岁 0.184949
36岁到40岁 0.185159
41岁及以上 0.159456
Name: UserId, dtype: float64
# 格式化一下
>>> result = round(result,4)*100
>>> result.map("{:.2f}%".format)
年龄分层
18岁及以下 2.57%
19岁到25岁 25.95%
26岁到30岁 18.52%
31岁到35岁 18.49%
36岁到40岁 18.52%
41岁及以上 15.95%
Name: UserId, dtype: object
回复:微信 获取
记得点在看~我是严小样儿
评论