bytes
从上面直接可以知道数据集的行列数,数据集的大小,每一列的数据类型,以及有多少条非空数据。
统计信息概览
快速计算数值型数据的关键统计指标,像平均数、中位数、标准差等等。
import pandas as pd
pd.set_option('display.unicode.ambiguous_as_wide', True)#设置列名对齐
pd.set_option('display.unicode.east_asian_width', True)#设置列名对齐
df2 = pd.read_csv('流量练习数据.csv',engine='python')
ret = df2.describe()
print(ret)
执行输出:
访客数 客单价
count 5.000000 5.000000
mean 17389.200000 56.638000
std 13887.997235 40.895298
min 4361.000000 0.080000
25% 5183.000000 37.150000
50% 13747.000000 54.300000
75% 28467.000000 91.730000
max 35188.000000 99.930000
我们本来有5列数据,为什么返回结果只有两列?那是因为这个操作只针对数值型的列。其中count是统计每一列的有多少个非空数值,mean、std、min、max对应的分别是该列的均值、标准差、最小值和最大值,25%、50%、75%对应的则是分位数。
四、列的基本处理方式
这里,我们采用SQL四大法宝的逻辑来简单梳理针对列的基本处理方式——增、删、选、改。
温馨提示:使用Pandas时,尽量避免用行或者EXCEL操作单元格的思维来处理数据,要逐渐养成一种列向思维,每一列是同宗同源,处理起来是嗖嗖的快。
增加一列,用df['新列名'] = 新列值的形式,在原数据基础上赋值即可:
import pandas as pd
pd.set_option('display.unicode.ambiguous_as_wide', True)#设置列名对齐
pd.set_option('display.unicode.east_asian_width', True)#设置列名对齐
df2 = pd.read_csv('流量练习数据.csv',engine='python')
df2['新增的列'] = range(1,len(df2)+1)
ret = df2.head()
print(ret)
执行输出:
流量来源 来源明细 访客数 支付转化率 客单价 新增的列
0 一级 -A 35188 9.98% 54.30 1
1 一级 -B 28467 11.27% 99.93 2
2 一级 -C 13747 2.54% 0.08 3
3 一级 -D 5183 2.47% 37.15 4
4 一级 -E 4361 4.31% 91.73 5
我们用drop函数制定删除对应的列,axis = 1表示针对列的操作,inplace为True,则直接在源数据上进行修改,否则源数据会保持原样。
import pandas as pd
pd.set_option('display.unicode.ambiguous_as_wide', True)#设置列名对齐
pd.set_option('display.unicode.east_asian_width', True)#设置列名对齐
df2 = pd.read_csv('流量练习数据.csv',engine='python')
df2['新增的列'] = range(1,len(df2)+1)
df2.drop('新增的列',axis=1,inplace=True)
ret = df2.head()
print(ret)
执行输出:
流量来源 来源明细 访客数 支付转化率 客单价
0 一级 -A 35188 9.98% 54.30
1 一级 -B 28467 11.27% 99.93
2 一级 -C 13747 2.54% 0.08
3 一级 -D 5183 2.47% 37.15
4 一级 -E 4361 4.31% 91.73
想要选取某一列怎么办?df['列名']即可:
import pandas as pd
pd.set_option('display.unicode.ambiguous_as_wide', True)#设置列名对齐
pd.set_option('display.unicode.east_asian_width', True)#设置列名对齐
df2 = pd.read_csv('流量练习数据.csv',engine='python')
ret = df2['客单价']
print(ret)
执行输出:
0 54.30
1 99.93
2 0.08
3 37.15
4 91.73
选取多列呢?需要用列表来传递:df[['第一列','第二列','第三列'..]]
import pandas as pd
pd.set_option('display.unicode.ambiguous_as_wide', True)#设置列名对齐
pd.set_option('display.unicode.east_asian_width', True)#设置列名对齐
df2 = pd.read_csv('流量练习数据.csv',engine='python')
ret = df2[['流量来源','访客数','支付转化率']]
print(ret)
执行输出:
流量来源 访客数 支付转化率
0 一级 35188 9.98%
1 一级 28467 11.27%
2 一级 13747 2.54%
3 一级 5183 2.47%
4 一级 4361 4.31%
好事多磨,复杂的针对特定条件和行列的筛选、修改,放在后面结合案例细讲,这里只讲一下最简单的更改:df['旧列名'] = 某个值或者某列值,就完成了对原列数值的修改。
比如,将数据来源,统一改成aliyun
import pandas as pd
pd.set_option('display.unicode.ambiguous_as_wide', True)#设置列名对齐
pd.set_option('display.unicode.east_asian_width', True)#设置列名对齐
df2 = pd.read_csv('流量练习数据.csv',engine='python')
df2['来源明细'] = 'aliyun'
ret = df2.head()
print(ret)
执行输出:
流量来源 来源明细 访客数 支付转化率 客单价
0 一级 aliyun 35188 9.98% 54.30
1 一级 aliyun 28467 11.27% 99.93
2 一级 aliyun 13747 2.54% 0.08
3 一级 aliyun 5183 2.47% 37.15
4 一级 aliyun 4361 4.31% 91.73
五、常用数据类型及操作
字符串类型是最常用的格式之一了,Pandas中字符串的操作和原生字符串操作几乎一毛一样,唯一不同的是需要在操作前加上".str"。
小Z温馨提示:我们最初用df2.info()查看数据类型时,非数值型的列都返回的是object格式,和str类型深层机制上的区别就不展开了,在常规实际应用中,我们可以先理解为object对应的就是str格式,int64对应的就是int格式,float64对应的就是float格式即可。
在案例数据中,我们发现来源明细那一列,可能是系统导出的历史遗留问题,每一个字符串前面都有一个“-”符号,又丑又无用,所以把他给拿掉:
一般来说清洗之后的列是要替换掉原来列的:
import pandas as pd
pd.set_option('display.unicode.ambiguous_as_wide', True)#设置列名对齐
pd.set_option('display.unicode.east_asian_width', True)#设置列名对齐
df2 = pd.read_csv('流量练习数据.csv',engine='python')
df2['来源明细'] = df2['来源明细'].str.replace('-','')
ret = df2.head()
print(ret)
执行输出:
流量来源 来源明细 访客数 支付转化率 客单价
0 一级 A 35188 9.98% 54.30
1 一级 B 28467 11.27% 99.93
2 一级 C 13747 2.54% 0.08
3 一级 D 5183 2.47% 37.15
4 一级 E 4361 4.31% 91.73
数值型数据,常见的操作是计算,分为与单个值的运算,长度相等列的运算。
以案例数据为例,源数据访客数我们是知道的,现在想把所有渠道的访客都加上10000,怎么操作呢?
import pandas as pd
pd.set_option('display.unicode.ambiguous_as_wide', True)#设置列名对齐
pd.set_option('display.unicode.east_asian_width', True)#设置列名对齐
df2 = pd.read_csv('流量练习数据.csv',engine='python')
df2['访客数'] = df2['访客数'] + 10000
ret = df2.head()
print(ret)
执行输出:
流量来源 来源明细 访客数 支付转化率 客单价
0 一级 -A 45188 9.98% 54.30
1 一级 -B 38467 11.27% 99.93
2 一级 -C 23747 2.54% 0.08
3 一级 -D 15183 2.47% 37.15
4 一级 -E 14361 4.31% 91.73
需要选中访客数所在列,然后加上10000即可,pandas自动将10000和每一行数值相加,针对单个值的其他运算(减乘除)也是如此。
列之间的运算语句也非常简洁。源数据是包含了访客数、转化率和客单价,而实际工作中我们对每个渠道贡献的销售额更感兴趣。(销售额 = 访客数 X 转化率 X 客单价)
对应操作语句:df['销售额'] = df['访客数'] * df['转化率'] * df['客单价']
但为什么疯狂报错?
导致报错的原因,是数值型数据和非数值型数据相互计算导致的。PANDAS把带“%”符号的转化率识别成字符串类型,我们需要先拿掉百分号,再将这一列转化为浮点型数据:
import pandas as pd
pd.set_option('display.unicode.ambiguous_as_wide', True)#设置列名对齐
pd.set_option('display.unicode.east_asian_width', True)#设置列名对齐
df2 = pd.read_csv('流量练习数据.csv',engine='python')
df2['支付转化率'] = df2['支付转化率'].str.replace('%','').astype(float)
ret = df2.head()
print(ret)
执行输出:
流量来源 来源明细 访客数 支付转化率 客单价
0 一级 -A 35188 9.98 54.30
1 一级 -B 28467 11.27 99.93
2 一级 -C 13747 2.54 0.08
3 一级 -D 5183 2.47 37.15
4 一级 -E 4361 4.31 91.73
要注意的是,这样操作,把9.98%变成了9.98,所以我们还需要让支付转化率除以100,来还原百分数的真实数值:
import pandas as pd
pd.set_option('display.unicode.ambiguous_as_wide', True)#设置列名对齐
pd.set_option('display.unicode.east_asian_width', True)#设置列名对齐
df2 = pd.read_csv('流量练习数据.csv',engine='python')
df2['支付转化率'] = df2['支付转化率'].str.replace('%','').astype(float)
df2['支付转化率'] = df2['支付转化率'] / 100
ret = df2.head()
print(ret)
执行输出:
流量来源 来源明细 访客数 支付转化率 客单价
0 一级 -A 35188 0.0998 54.30
1 一级 -B 28467 0.1127 99.93
2 一级 -C 13747 0.0254 0.08
3 一级 -D 5183 0.0247 37.15
4 一级 -E 4361 0.0431 91.73
然后,再用三个指标相乘计算销售额:
import pandas as pd
pd.set_option('display.unicode.ambiguous_as_wide', True)#设置列名对齐
pd.set_option('display.unicode.east_asian_width', True)#设置列名对齐
df2 = pd.read_csv('流量练习数据.csv',engine='python')
df2['支付转化率'] = df2['支付转化率'].str.replace('%','').astype(float)
df2['支付转化率'] = df2['支付转化率'] / 100
df2['销售额'] = df2['访客数'] * df2['支付转化率'] * df2['客单价']
ret = df2.head()
print(ret)
执行输出:
流量来源 来源明细 访客数 支付转化率 客单价 销售额
0 一级 -A 35188 0.0998 54.30 190688.698320
1 一级 -B 28467 0.1127 99.93 320598.513837
2 一级 -C 13747 0.0254 0.08 27.933904
3 一级 -D 5183 0.0247 37.15 4755.946715
4 一级 -E 4361 0.0431 91.73 17241.488243
PANDAS中时间序列相关的水非常深,这里只对日常中最基础的时间格式进行讲解,对时间序列感兴趣的同学可以自行查阅相关资料,深入了解。
以案例数据为例,我们这些渠道数据,是在2019年8月2日提取的,后面可能涉及到其他日期的渠道数据,所以需要加一列时间予以区分,在EXCEL中常用的时间格式是'2019-8-3'或者'2019/8/3',我们用PANDAS来实现一下:
import pandas as pd
pd.set_option('display.unicode.ambiguous_as_wide', True)#设置列名对齐
pd.set_option('display.unicode.east_asian_width', True)#设置列名对齐
df2 = pd.read_csv('流量练习数据.csv',engine='python')
df2['日期'] = '2019-8-3'
ret = df2.head()
print(ret)
执行输出:
流量来源 来源明细 访客数 支付转化率 客单价 日期
0 一级 -A 35188 9.98% 54.30 2019-8-3
1 一级 -B 28467 11.27% 99.93 2019-8-3
2 一级 -C 13747 2.54% 0.08 2019-8-3
3 一级 -D 5183 2.47% 37.15 2019-8-3
4 一级 -E 4361 4.31% 91.73 2019-8-3
在实际业务中,一些时候PANDAS会把文件中日期格式的字段读取为字符串格式,这里我们先把字符串'2019-8-3'赋值给新增的日期列,然后用to_datetime()函数将字符串类型转换成时间格式:
import pandas as pd
pd.set_option('display.unicode.ambiguous_as_wide', True)#设置列名对齐
pd.set_option('display.unicode.east_asian_width', True)#设置列名对齐
df2 = pd.read_csv('流量练习数据.csv',engine='python')
df2['日期'] = '2019-8-3'
df2['日期'] = pd.to_datetime(df2['日期'])
ret = df2.head()
print(ret)
执行输出:
流量来源 来源明细 访客数 支付转化率 客单价 日期
0 一级 -A 35188 9.98% 54.30 2019-08-03
1 一级 -B 28467 11.27% 99.93 2019-08-03
2 一级 -C 13747 2.54% 0.08 2019-08-03
3 一级 -D 5183 2.47% 37.15 2019-08-03
4 一级 -E 4361 4.31% 91.73 2019-08-03
转换成时间格式(这里是datetime64)之后,我们可以用处理时间的思路高效处理这些数据,比如,我现在想知道提取数据这一天离年末还有多少天('2019-12-31'),直接做减法(该函数接受时间格式的字符串序列,也接受单个字符串):
import pandas as pd
pd.set_option('display.unicode.ambiguous_as_wide', True)#设置列名对齐
pd.set_option('display.unicode.east_asian_width', True)#设置列名对齐
df2 = pd.read_csv('流量练习数据.csv',engine='python')
df2['日期'] = '2019-8-3'
df2['日期'] = pd.to_datetime('2019-12-31') - pd.to_datetime(df2['日期'])
ret = df2.head()
print(ret)
执行输出:
流量来源 来源明细 访客数 支付转化率 客单价 日期
0 一级 -A 35188 9.98% 54.30 150 days
1 一级 -B 28467 11.27% 99.93 150 days
2 一级 -C 13747 2.54% 0.08 150 days
3 一级 -D 5183 2.47% 37.15 150 days
4 一级 -E 4361 4.31% 91.73 150 days
是不是非常简单?
最后我们一起快速回顾下第一篇文章的内容:
第一步,我们先了解PANDAS到底是个什么东西。
第二步,学习如何构建、读入存储数据。
第三步,拿到数据之后,怎么样快速查看数据。
第四步,对数据有了基础了解,就可以进行简单的增删选改了。
第五步,在了解基础操作之后,对Pandas中基础数据类型进行了初步照面。