python做数据透视表_Python--数据透视表和交叉表、数据读取

数据 透视表 and 交叉表

先看数据是什么样的 ...

ContractedBlock.gif

ExpandedBlockStart.gif

#date

dati = ['2019-11-01','2019-11-02','2019-11-03']*3rng=pd.to_datetime(dati)

df=DataFrame({'date':rng,'key':list('abcdabcda'),'value':np.random.randn(9)*10})

df

View Code

1813202-20191123152700542-1825021385.png

简单的透视表 方法👉 pivot_table()

语法是这样的 :

pd.pivot_table(

data,

values=None,

index=None,

columns=None,

aggfunc='mean',

fill_value=None,

margins=False,

dropna=True,

margins_name='All',

observed=False,

)#data : DataFrame 对象#values : 要聚合的列 或者 列表#index : 数据透视表的index , 行索引 ,从原始数据的列中进行筛选#columns : 数据透视表的columns 列名 ,从原始数据中筛选#aggfunc : 用于聚合的函数 , 默认是 np.mean , 支持numpy 的计算方法

所以按照语法 ,应该这样操作 ,不需要每个都填上, 根据我们需要的 ,填上对应的数据及参数就可以了.

pd.pivot_table(df , values='value',index='date',columns='key',aggfunc=np.mean)

1813202-20191123153450168-1123751752.png

# 👆 这个就是从date中根据 值 对应的key中的值,以一对一,一对多的方式寻找 ,如果没有找到 就用NaN 填充 ,

# 👆 data 中的 2019 -11 - 01 在key 中有a , c ,d ,有就对应填充 , 而 b没有就用NaN填充。2019 -11 -02 , 2019 - 11 -03 依次类推。

pd.pivot_table(df,values='value',index=['date','key'],aggfunc=np.sum)#以date ,key 共同做行进行索引,值为value,统计不同(date, key)情况下的计算

1813202-20191123154145062-125214547.png

# 👆 , 这也就是用层次索引的计算嘛 , 一看图就懂了。简单的数据透视表.想深入理解,请自行百度。

交叉表的实现 方法 👉 crosstab()

在默认情况下 , crosstab() 计算因子的频率表 , 比如用于 str 的数据透视分析

语法是这样的 :

pd.crosstab(index,

columns,

values=None,

rownames=None,

colnames=None,

aggfunc=None,

margins=False,

margins_name='All',

dropna=True,

normalize=False,

)

演示数据:

ContractedBlock.gif

ExpandedBlockStart.gif

nf =DataFrame({'A':[1,2,2,2,2],'B':[3,3,4,4,4],'C':[1,1,np.nan,1,1]

})

View Code

1813202-20191123155020505-1898293190.png

简单交叉表实现 :

pd.crosstab(nf['A'],nf['B'])#如果crosstab 只接收两个Series 它将提供一个频率表#上面代码是用 A 的唯一值,统计 B 的唯一的出现次数

1813202-20191123155148771-1160884156.png

# 👆 注解 :A=1 and B =3 出现过1次 , A=2and B =3 出现过1次, B= 4 and A=1 出现过0次 ,B =4 and A =2 出现过3次,所以竖这看就是 1 1 0 3。OK!

设置 normalize 参数为 True 时,会显示百分百,总的百分百 :

pd.crosstab(nf['A'],nf['B'],normalize=True)

1813202-20191123155458316-878266314.png

# 👇 下方为 交叉表C列计算 ,,,,

pd.crosstab(nf['A'],nf['B'],values=nf['C'],aggfunc=sum)#values : 可选 , 根据因子聚合的值得列或者说是数组#aggfunc : 可选 ,如果未传递values数据,则计算频率,如果传递了数组,则按照指定计算#相同于按照A和B界定分组,计算每一组中第三个列C的值

# 👆 这个就是 A和B交叉表的C列的值 计算 ,A和B交叉出现几次 就把A和B交叉的对于C列计算。看图秒懂

1813202-20191123160234895-1816491929.png

margins 参数 :布尔值 ,默认是False ,用于添加 行 or 列 的小计,就是求和

pd.crosstab(nf['A'],nf['B'],values=nf['C'],margins=True,margins_name='小计',aggfunc=sum)#margins_name 就是重命名嘛 , 一看就懂了, , , NaN值都是自动忽略的

1813202-20191123160734641-1046889034.png

数据的读取 txt / csv / excel ...... 方法👉 read_*()

*就是 按Tab 键位 会出现read_ 列表 ,选取自己所需要的

read_table()主要用来读取简单的数据 , txt or csv

文件打开是这样的 :

1813202-20191123161404012-1435924063.png

👇 文件数据的读取 :

dinner = pd.read_table('diner.csv',delimiter=',',header=0,index_col=0 ,encoding='gbk')

dinner.head()#默认取前5条数据

# delimiter : 用于拆分的字符 ,也可以使用sep=','

# header : 用作列名的序号 ,默认为 0 也就是第一行 .如果没有,header=None

# index_col : 指定某列为行索引 ,否则自动索引(0,1,2....)

1813202-20191123161520136-1260351816.png

专门用来读取 csv 数据 👉 read_csv() :

作用和上面的一样,不过上面的写法更为标准

d_csv = pd.read_csv('diner.csv',engine='python')

d_csv.head()

1813202-20191123162144794-1550438229.png

还有读取excel 数据 👉 read_excel()

d_excel = pd.read_excel('demo.xlsx',sheet_name='demo',header=0)

d_excel.head()#sheet_name : 取 excel文件中的一张表 ,返回多张使用sheet_name=[0,1],sheet_name=None 返回全表#1. int / string 返回的是dataframe#2. none / list 返回的是dict 字典

loading.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值