【pandas】index&colums



2017年10月17日    Author:Guofei

文章归类: 0x12_Pandas与numpy    文章编号: 104

版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2017/10/17/pandascleandata4.html


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)
    
    1. values, index, columns 既可以传入字段名,也可以传入 list<字段名>
    2. margins=True 可以添加小计
    3. 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型了

??参数还可以是其它类型吗 ??字符格式的时间能不能转成时间格式 【未完待续】自己查


您的支持将鼓励我继续创作!