python数据标签分布是干啥的

Python016

python数据标签分布是干啥的,第1张

一般是根据分析目的,将数据进行分组,研究各组别分布规律的一种分析方法。数据分组方式有两种:等距或不等距分组。

分布分析在实际的数据分析实践中应用非常广泛,常见的有用户性别分布,用户年龄分布,用户消费分布等等。

本文将进行如下知识点讲解:

1.数据类型的修改

2.新字段生成方法

3.数据有效性校验

4.性别与年龄分布

分布分析

1.导入相关库包

import pandas as pd

import matplotlib.pyplot as plt

import math

2.数据处理

>>>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

由于接下来我们需要做年龄分布分析,但是从源数据info()方法可知,并无年龄字段,需要自己生成。

# 查看年龄区间,进行分区

>>>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)

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)

# 计算年龄

# 方法一

>>>df['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)

4.年龄分布

# 查看年龄区间,进行分区

>>>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)

由于该数据记录的是用户登录信息,所以必定有重复数据。而Python如此强大,一个nunique()方法就可以进行去重统计了。

# 查看是否有重复值

>>>df.duplicated('UserId').sum() #47681

# 数据总条目

>>>df.count() #980954

分组后用count()方法虽然也能够计算分布情况,但是仅限于无重复数据的情况。而Python这么无敌,提供了nunique()方法可用于计算含重复值的情况

age = soup.find(attrs={"class":"age"}) #你这里find只要一个attrs参数不会报错。

if age == None: #简单点可以用 if not age:

print u'没有找到'

else:

soup.find(attrs={"class":"name"})

#否则用findAll找出所有具有这个class的tr

tr = html.find("tr", attrs={"class":"show_name"})

tds = tr.findAll("td")

for td in tds:

print td.string # 或许不是string属性,你可以用dir(td)看看有哪些可用的。

扩展资料:

1、如果是函数定义中参数前的*表示的是将调用时的多个参数放入元组中,**则表示将调用函数时的关键字参数放入一个字典中。

1)如定义以下函数:

def func(*args):print(args)

当用func(1,2,3)调用函数时,参数args就是元组(1,2,3)

2)如定义以下函数:

def func(**args):print(args)

当用func(a=1,b=2)调用函数时,参数args将会是字典{'a':1,'b':2}

学python的同时一定会接触到其他技术,毕竟光会python这门语言是不够的,要看用它来做什么。比如说用 python做爬虫,就必须接触到html, http等知识。

python是现在最火的数据分析工具语言python的进阶的路线是数据清洗,爬虫,数据容器,之后是卷积,线性分析,和机器学习,区块连,金融方面的量化等高端进阶。

关于编程,有三种方式

1、面向对象编程---->类 关键字:class

2、面向过程编程---->过程 关键字:def

3、函数式编程------>函数 关键字:def

函数式编程:函数是逻辑化结构化和过程化的一种编程方式,如

def test(x):

"xxxxx"

x+=1

return x

def:定义函数的关键字

test:函数名称

(x):传入函数的参数

x+=1:泛指逻辑处理块代码

"xxxx"函数描述(非必要,但强列建议添加)

定义一个过程,过程无返回值

def fun1():

"fun1"

print('fun1')

定义一个函数,函数有返回值

def fun2():

"fun2"

print('fun2')

return 0

函数和过程的调用是一致的:

fun1

fun2

在python中,过程就是一个没有返回值的函数,过程默认返因一个none,当函数有多个返回值时,将返回元组,这些值将被当做一个元组的元素,即:

返回值个数0:返回NONE

返回值个数1:返回object

返回值个数多个:返回元组

函数的功能:没有函数的编程只是在写逻辑(功能),脱离函数,重用逻辑(实现功能),唯一的方式就是复制粘贴,使用函数后简化代码,可读性变高,易扩展(保持一致性)

在定义函数时的参数,我们称为行参,如下面的x,y

而调用函数时传入的参数,我们称之为实参,如下面的1、2。

def test(x,y)

print(x)

print(y)

test(1,2)

位置调用时行参与实参的位置关系是一一对应的

def test(x,y)

print(x)

print(y)

test(1,2)

关键字调用时,与实参的位置无关如

def test(x,y)

print(x)

print(y)

test(y=2,x=3)

当位置调用与关键字调用混用时,按照位置调用方式执行,但要记位一句话,关键字参数不能写在位置参数前面,即test(3,y=2,6)此种方式将会报错,应写成test(3,2,z=6)或test(3,z=2,y=6)

当函数中有默认的参数值时如

def test(x,y=1)

.....

return 0

当调用这个函数时,如果不传入y的值时,y的值将采用默认值,如果传入新的y的值时,默认y的值将被覆盖。

默认值使用的场合:

1、软件安装的时候

2、连接数据库的端口

参数组:当行参或实参数量不固定的时候时使用,可与默认参数或行参混用,参数组一定要最至最后

def test(*args)#接收N个位置参数#def test(name,*args) #def test(name,age=1,*args)

print(args)

test(1,2,3,4,5……)

test(*[1,2,3,4……])

最终实参会被变成一个元组如:

def fun(agr1,agr2,*args)

pass

fun(1,2,3,4,5)

====结果=====

1,2,(3,4,5)

这种方式是预留以后当需要传多个参数时使用而不变动太多的代码

传入不定数量字典时:把N个关键字参数转换成字典的方式,可与默认参数或行参混用,参数组一定要最至最后

def test(agrs1,agrs2,**kwargs) #接收N个关键字参数

# print(kwagrs)

# print(kwagrs['name'])

# print(kwagrs['age'])

pass

test(3,5,name='a',age=23,sex='F')#以关键字的方式传值

=====结果====

3,5,{'name':'a','age':23,'sex':'f'}

test(**{name:'a',age:8,sex:'F'})

###位置参数不能写在关键字参数后面,否则程序会报错

函数调用函数

def test1()

print......

def test2()

print...

test1() #调用test1

print(test2()) #调用