还在用Excel做数据透视表?试试Python吧

import pandas as pd
import numpy as np

分层索引

data = pd.Series(
    np.random.randn(9),
    index = [['a','a','a','b','b','c','c','d','d'],
            [1,2,3,1,3,1,2,2,3]]
)
data
a  1    0.516036
   2    0.212449
   3   -0.361522
b  1    0.078206
   3   -0.680907
c  1    0.118010
   2   -0.087036
d  2    0.416130
   3    0.101482
dtype: float64
#查看索引
data.index
MultiIndex([('a', 1),
            ('a', 2),
            ('a', 3),
            ('b', 1),
            ('b', 3),
            ('c', 1),
            ('c', 2),
            ('d', 2),
            ('d', 3)],
           )
#查看数据
data['b':'d']
b  1    0.078206
   3   -0.680907
c  1    0.118010
   2   -0.087036
d  2    0.416130
   3    0.101482
dtype: float64
data.loc[['b','d']]
b  1    0.078206
   3   -0.680907
d  2    0.416130
   3    0.101482
dtype: float64
data.loc[:,3]
a   -0.361522
b   -0.680907
d    0.101482
dtype: float64
# 重新排列数据
data.unstack()
123
a0.5160360.212449-0.361522
b0.078206NaN-0.680907
c0.118010-0.087036NaN
dNaN0.4161300.101482
# 组合索引
data.unstack().stack()
a  1    0.516036
   2    0.212449
   3   -0.361522
b  1    0.078206
   3   -0.680907
c  1    0.118010
   2   -0.087036
d  2    0.416130
   3    0.101482
dtype: float64
# 为各层索引命名
frame = pd.DataFrame(np.arange(12).reshape(4,3),
                    index=[['a','a','b','b'],
                         [1,2,1,2]],
                    columns=[['A','A','B'],
                            ['G','R','G']])
frame
AB
GRG
a1012
2345
b1678
291011
frame.index.names = ['key1','key2']
frame
AB
GRG
key1key2
a1012
2345
b1678
291011
frame.columns.names = ['S','C']
frame
SAB
CGRG
key1key2
a1012
2345
b1678
291011
# 更换索引位置
frame.swaplevel('key1','key2')
SAB
CGRG
key2key1
1a012
2a345
1b678
2b91011
# 按照层级索引排序
# 按key2排序
frame.sort_index(level=1)
SAB
CGRG
key1key2
a1012
b1678
a2345
b291011
# 按索引层级进行汇总
frame.sum(level='key2')
SAB
CGRG
key2
16810
2121416
frame.sum(level='C',axis=1)
CGR
key1key2
a121
284
b1147
22010
# 设置列的索引
frame = pd.DataFrame({
    'a':range(7),
    'b':range(7,0,-1),
    'c':['one','one','one','two','two','two','two'],
    'd':[0,1,2,0,1,2,3]
})
frame
abcd
007one0
116one1
225one2
334two0
443two1
552two2
661two3
#drop=False 保留用作索引的列
frame2 = frame.set_index(['c','d'])
frame2
ab
cd
one007
116
225
two034
143
252
361
#恢复索引
frame2.reset_index()
cdab
0one007
1one116
2one225
3two034
4two143
5two252
6two361

联合及合并数据

df1 = pd.DataFrame({
    'key':['b','b','a','c','a','a','b'],
    'data1':range(7)
})
df1
keydata1
0b0
1b1
2a2
3c3
4a4
5a5
6b6
df2 = pd.DataFrame({
    'key':['a','b','d'],
    'data2':range(3)
})
df2
keydata2
0a0
1b1
2d2

inner内连接 为两表交集

outer外链接,为两表并集 笛卡尔积

left左连接,保留左表

right右连接,保留右表

# 联合表 自动将重叠列名作为连接的键,默认是内连接inner 即交集2
pd.merge(df1,df2)
keydata1data2
0b01
1b11
2b61
3a20
4a40
5a50
#显式指定
pd.merge(df1,df2,left_on='key',right_on='key')
keydata1data2
0b01
1b11
2b61
3a20
4a40
5a50
#指定为外连接
pd.merge(df1,df2,how='outer')
keydata1data2
0b0.01.0
1b1.01.0
2b6.01.0
3a2.00.0
4a4.00.0
5a5.00.0
6c3.0NaN
7dNaN2.0
# 使用join连接 按照索引合并
df1.set_index(df1['key'])
df2.set_index(df2['key'])

keydata2
key
aa0
bb1
dd2

沿轴向连接

arr = np.arange(6).reshape(2,3)
arr
array([[0, 1, 2],
       [3, 4, 5]])
np.concatenate([arr,arr],axis=0)
array([[0, 1, 2],
       [3, 4, 5],
       [0, 1, 2],
       [3, 4, 5]])
np.concatenate([arr,arr],axis=1)
array([[0, 1, 2, 0, 1, 2],
       [3, 4, 5, 3, 4, 5]])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值