MultiIndex
import pandas as pd
import numpy as np
df=pd.DataFrame(np.random.rand(16).reshape(4,-1))
index=pd.Index([('A','x'),('A','y'),('B','x'),('B','y')],name=['class1','class2'])
df.index=index
df
0 | 1 | 2 | 3 | ||
---|---|---|---|---|---|
class1 | class2 | ||||
A | x | 0.066857 | 0.245256 | 0.042875 | 0.725917 |
y | 0.450916 | 0.776887 | 0.369172 | 0.655803 | |
B | x | 0.642242 | 0.119586 | 0.084696 | 0.377162 |
y | 0.080035 | 0.653582 | 0.825833 | 0.420380 |
每个层次的名字
index.levels
- output
FrozenList([['A', 'B'], ['x', 'y']])
每个层次分别的归属
index.labels
- output
FrozenList([[0, 0, 1, 1], [0, 1, 0, 1]])
每一个index
index[0]
- output
('A', 'x')
index&columns名称修改
取index&columns
df.index
df.columns
df.index.values
df.columns.values
df.index.name='idx'#设置index的名称
赋值修改index&columns
index是不可修改对象,要修改就只能整体换掉。
- data.index可以直接赋值为Series或list
- data.columns可以直接赋值为Series或list
用rename修改index和Seris
需要知道修改前的字段和修改后的字段
import pandas as pd
import numpy as np
df=pd.DataFrame(np.arange(16).reshape(4,-1),index=list('abcd'),columns=list('gfjk'))
df.rename(index={'a':'aa','e':'ee'},columns={'g':'gg'},inplace=True)
修改为首字母大写,大写
df.rename(index={'a':'aa','e':'ee'},columns={'g':'gg'},inplace=True)
set_index
import pandas as pd
import numpy as np
df=pd.DataFrame(np.arange(16).reshape(-1,4),index=list('abcd'),columns=list('wxyz'))
- 把某1列/多列变成index:
df.set_index(['w','x'],inplace=True)#多列变成index, 多级目录
- append=True: 保留原index不删除
import pandas as pd import numpy as np df=pd.DataFrame(np.arange(16).reshape(-1,4),index=list('abcd'),columns=list('wxyz')) df.set_index(['w','x'],inplace=True,append=True)
y | z | |||
---|---|---|---|---|
w | x | |||
a | 0 | 1 | 2 | 3 |
b | 4 | 5 | 6 | 7 |
c | 8 | 9 | 10 | 11 |
d | 12 | 13 | 14 | 15 |
- drop=False
不把这些列移除。
reset_index
把index变成普通的列。
然后index填充为0,1,2,3…
df.reset_index(inplace=True)
用index变换整个DataFrame
stack/unstack
- stack:变成Series。index变成一级index,columns变成二级index
import pandas as pd import numpy as np df=pd.DataFrame(np.arange(16).reshape(-1,4),index=list('abcd'),columns=list('wxyz')) df.stack()
- unstack:变成Series。columns变成一级index,index变成二级index
import pandas as pd import numpy as np df=pd.DataFrame(np.arange(16).reshape(-1,4),index=list('abcd'),columns=list('wxyz')) df.unstack()
- output:
0 | ||
---|---|---|
w | a | 0 |
b | 4 | |
c | 8 | |
d | 12 | |
x | a | 1 |
b | 5 | |
c | 9 | |
d | 13 | |
y | a | 2 |
b | 6 | |
c | 10 | |
d | 14 | |
z | a | 3 |
b | 7 | |
c | 11 | |
d | 15 |
注意:stack与unstack 不是 逆操作。
pivot透视表
选取三列,分别作为行索引,列索引,元素值,将其转成二维表格
数据准备:
import pandas as pd
import numpy as np
df=pd.DataFrame(np.arange(16).reshape(-1,4),columns=list('wxyz'))
df.loc[:,'w']=[0,0,1,1]
df.loc[:,'x']=[3,4,3,4]
df.pivot(index='w',columns='x',values='y')
x | 3 | 4 |
---|---|---|
w | ||
0 | 2 | 6 |
1 | 10 | 14 |
注意:index, columns, values 这三列都只能接受一个值。
如果不指定values,会把所有数据变成values,并生成多列数据
df.pivot(index='w',columns='x')
x | 3 | 4 |
---|---|---|
w | ||
0 | 2 | 6 |
1 | 10 | 14 |
pivot_table:更强大
import numpy as np
df = pd.DataFrame(np.arange(16).reshape(-1, 4), columns=list('wxyz'))
df.loc[:, 'w'] = [0, 0, 1, 1]
df.loc[:, 'x'] = [3, 4, 3, 4]
df
- 每个参数都可以传入列表
df.pivot_table(values=['y', 'z'], index=['w'], columns='x')
- margins=True可以添加小计,配合聚合函数(默认是均值)
df.pivot_table(values=['y','z'],index=['w'],columns='x',margins=True,aggfunc=len)
values
,index
,columns
既可以传入字段名,也可以传入 list<字段名>字段名>margins=True
可以添加小计aggfunc
默认是均值,可以是自定义函数。如果是自定义函数,入参是一个pd.Seris
,内容是 分片+values 颗粒度
get_dummies哑变量变换
数据准备
import pandas as pd
from scipy.stats import norm
df=pd.DataFrame(norm().rvs(size=(1000,2)),columns=list('wx'))
a=pd.qcut(df.w,3,labels=list('abc'))#生成category
生成哑变量
pd.get_dummies(a)
pd.get_dummies(a,prefix='key')#生成的每列加前缀
交换index
swaplevel()
这里先交换再排序:
import pandas as pd
import numpy as np
df=pd.DataFrame(np.arange(16).reshape(-1,4),index=list('abcd'),columns=list('wxyz'))
df.set_index(['w'],append=True,inplace=True)
df.swaplevel().sort_index()
w | x | y | z | |
---|---|---|---|---|
0 | 0 | 3 | 2 | 3 |
1 | 0 | 4 | 6 | 7 |
2 | 1 | 3 | 10 | 11 |
3 | 1 | 4 | 14 | 15 |
填充
用reindex填充index
- 前提:原index是某种连续的值
- 没有inplace,不修改原df,而是返回一个DataFrame
import pandas as pd
import numpy as np
df=pd.DataFrame(np.arange(12).reshape(-1,4),index=list('abc'),columns=list('wxyz'))
df.reindex(list('abcde'),method='ffill')
#index太多,默认填值为nan,可以ffill,bfill填充
df.reindex(list('abcde'),fill_value=0)
#用指定的数填充
参数 | 说明 |
---|---|
index | |
method | ffill,bfill |
fiil_value | |
limit | 向前或向后填充时,最大填充量 |
copy | 默认为True,否则不复制 |
案例:时间序列中填充index
idx = pd.date_range('09-01-2013', '09-30-2013')
s = pd.Series({'09-02-2013': 2,
'09-03-2013': 10,
'09-06-2013': 5,
'09-07-2013': 1})#数据类型是<DatetimeIndex>
#下面扩展
s.index = pd.DatetimeIndex(s.index)#把原来index从字符串格式str变为时间格式Timestamp
s = s.reindex(idx,fill_value=np.nan)
#reindex不限于时间序列,idx还可以是list,这样可以扩展非时间序列的数据
??column能不能这么转
类型转换astype
data["medal"].astype("category")#这样,就把字符型,转换为category型了
??参数还可以是其它类型吗 ??字符格式的时间能不能转成时间格式 【未完待续】自己查