Pandas常用功能

来源:互联网 发布:淘宝店铺音乐链接地址 编辑:程序博客网 时间:2024/06/06 10:57

      • 重新索引
      • 丢弃指定轴上的项
      • 索引选取和过滤
      • 算术运算
        • 填充缺失值
        • 算术方法
      • ufuns
      • 排序和排名
        • sort_index
        • rank
      • 汇总和计算描述统计
        • 约简方法
        • 描述和汇总
        • 唯一值值计数以及成员资格
      • 处理缺失值
      • 层次化索引
        • 内外层数据选取
        • 数据重塑
        • 重排分级顺序
        • 根据级别汇总统计

重新索引

reindex基本用法

obj = Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c'])>> objd 4.5b 7.2a -5.3c 3.6obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=0)>> obj2a -5.3b 7.2c 3.6d 4.5e 0.0obj3 = Series(['blue', 'purple', 'yellow'], index=[0, 2, 4])obj3.reindex(range(6), method='ffill')>> obj30 bule1 bule2 purple3 purple4 yellow5 yellow

reindex修改索引(行)、列、或同时修改

frame = DataFrame(np.arange(9).reshape((3, 3)), index=['a', 'c', 'd'],                   columns=['Ohio','Texas','California'])>> frame   Ohio  Texas  Californiaa  0     1      2c  3     4      5d  6     7      8# 仅传入一个序列,会重新索引行frame2 = frame.reindex(['a', 'b', 'c', 'd'])>> frame2   Ohio  Texas  Californiaa  0     1      2b  NaN   NaN    NaNc  3     4      5d  6     7      8# 使用columns关键字,重新索引列states = ['Texas', 'Utha', 'California']frame3 = frame.reindex(columns=states)>> frame3   Texas  Utha   Californiaa  1      NaN    2c  4      NaN    5d  7      NaN    8# 同时对行列重新索引,但插值只能按行应用(轴0)frame4 = frame.reindex(index=['a', 'b', 'c', 'd'], method='ffill', columns=states)>> frame4   Texas  Utha   Californiaa  1      NaN    2b  1      NaN    2c  4      NaN    5d  7      NaN    8# ix的标签索引功能>> frame.ix[['a', 'b', 'c', 'd'],states]   Texas  Utha   Californiaa  1      NaN    2b  NaN    NaN    NaNc  4      NaN    5d  7      NaN    8

reindex函数的参数

参数 说明 index 用作索引的新序列 method fill,pad前向填充。bfill,backfill后向填充 fill_value 缺失值的替代值 limit 前向或后向填充的最大填充量 level 在multiIndex的指定级别上匹配简单索引,否则选取其子集 copy 默认为True

丢弃指定轴上的项

# 删除任意轴上索引,axis指定轴data = DataFrame(np.arange(16).reshape((4, 4)),                index=['Ohio', 'Colorado', 'Utha', 'New York'],                columns=['one', 'two', 'three', 'four'])>> data.drop(['Colorado', 'Ohio'])           one   two   three   fourUtah       8     9     10      11New York   12    13    14      15>> data.drop(['two', 'four'], axis=1)           one   threeOhio       0     2     Colorado   4     6Utah       8     10New York   12    14  

索引、选取和过滤

data = DataFrame(np.range(16).reshape((4, 4)),                 index=['Ohio', 'Colorado', 'Utah', 'New York'],                 columns=['one', 'two', 'three', 'four'])>> data           one   two   three  fourOhio       0     1     2      3Colorado   4     5     6      7Utah       8     9     10     11New York   12    13    14     15# obj[val]>> data[['three', 'one']]           three  oneOhio       2      0Colorado   6      4Utah       10     8New York   14     12>> data[:2]           one   two   three  fourOhio       0     1     2      3Colorado   4     5     6      7>> data[data['three'] > 5]           one   two   three  fourColorado   4     5     6      7Utah       8     9     10     11New York   12    13    14     15# obj.ix[val]>> data.ix['Colorado', ['two', 'three']]two    5three  6Name: Colorado>> data.ix[['Colorado', 'Utah'], [3, 0, 1]]           four  one   two   Colorado   7     4     5     Utah       11    8     9  >> data.ix[2]one    8two    9three  10four   11Name: Utah

DataFrame的索引选项

类型 说明 obj[val] 选取DataFramed的单个列或一组列。在一些特殊情况下比较便利:布尔型数组(过滤行)、切片(行切片)、布尔型DataFrame(根据条件设置值) obj.ix[val] 选取单个行或一组行 obj.ix[:,val] 选取单个列或列子集 obj.ix[val1,val2] 同时选取行和列 reindex 将一个或多个轴匹配到新索引 xs 根据标签选取单行或单列,并返回一个Series icol, irow 根据整数位置选取单列或单行,并返回一个Series get_value, set_value 根据行标签和列标签选取单个值

算术运算

pandas一个重要功能是,可以对不同索引的对象进行算术运算,对象相加时如果存在不同的索引对,则结果的索引就是该索引对的并集

df1 = DafaFrame(np.arange(9).reshape((3, 3)),                columns=list('bcd'),               index=['Ohio','Texas','Colorado'])df2 = DafaFrame(np.arange(12).reshape((4, 3)),                columns=list('bde'),               index=['Utah', 'Ohio','Texas','Colorado'])>> df1          b  c  dOhio      0  1  2Texas     3  4  5Colorado  6  7  8>> df2          b  d  eUtah      0  1  2Ohio      3  4  5Texas     6  7  8Oregon    9  10 11>> df1 + df2          b    c    d    eColorado  NaN  NaN  NaN  NaNOhio      3    NaN  6    NaNOregon    NaN  NaN  NaN  NaNTexas     9    NaN  12   NaNUtah      NaN  NaN  NaN  NaN

1. 填充缺失值

>> df1.add(df2,fill_value=0)          b    c    d    eColorado  6    7    8    0Ohio      3    1    6    5Oregon    9    0    10   11Texas     9    4    12   8Utah      0    0    1    2

2. 算术方法

方法 说明 add 加法运算 sub 减法运算 div 除法运算 mul 乘法运算

ufuns

Numpy的ufuns(元素级数组方法)也可用于操作pandas对象

# 求绝对值>> np.abs(df1)          b  c  dOhio      0  1  2Texas     3  4  5Colorado  6  7  8# apply方法f = lambda x: x.max() - x.min()>> df1.apply(f)b 6c 6d 6>> df1.apply(f, axis=1)Ohio     2Texas    2Colorado 2# 传递给apply的函数可以返回由多个值组成的seriesdef f(x):  return Series([x.min(), x.max()], index=['min', 'max'])>> df1.apply(f):     b  c  dmin  0  1  2max  6  7  8# applymap方法# 得到dataframe中各个浮点值的格式化字符串format = lambda x: '%.2f' % xframe.applymap(format)

排序和排名

1. sort_index

frame = DataFrame(np.arange(8).reshape((2, 4)), index=['two', 'one'],                 columns=['d', 'a', 'b', 'c'])# 默认对行index排序>> frame.sort_index()     d  a  b  cone  4  5  6  7two  0  1  2  3# 设置axis对columns排序>> frame.sort_index(axis=1)     a  b  c  dtwo  1  2  3  0one  5  6  7  4# 默认升序排序,设置降序frame.sort_index(axis=1, ascending=False)# 根据一个或多个列的中的值进行排序frame.sort_index(by='b')     d  a  b  ctwo  0  1  2  3one  4  5  6  7

2. rank

obj = Series([7, -5, 7, 4, 2, 0, 4])>> obj.rank()0 6.51 1.02 6.53 4.54 3.05 2.06 4.5>> obj.rank(method='first')0 61 12 73 44 35 26 5# 降序排obj.rank(ascending=False, method='max')# 在列计算排名obj.rank(axis=1)

排名时用于破坏平级关系的method选项

method 说明 average 默认,相等分组中为各值平均排名 min 使用整个分组的最小排名 max 使用整个分组的最大排名 first 按值在原始数据中的出现顺序分配排名

汇总和计算描述统计

1. 约简方法

>> df    one   twoa   1.4   NaNb   7.1   -4.5c   NaN   NaNd   0.75  -1.3# 按列求和>> df.sum()one  9.25two  -5.8# 按行求和>> df.sum(axis=1)a  1.4b  2.6c  NaNd  -0.55# Na值会被自动排除,除非整个切片都是Na,skipna选项可以禁用该功能>> df.mean(axis=1, skipna=False)a  NaNb  1.300c  NaNd  -0.275

约简方法的选项

选项 说明 axis 轴,行用0,列用1 skipna 排除缺失值,默认为True level 如果轴式层次化索引的(MultiIndex),则根据level分组

2. 描述和汇总

# 达到最小值或最大值的索引>> df.idxmax()one  btwo  a# 累计型>> df.cumsum()   one   twoa  1.4   NaNb  8.5   -4.5c  NaN   NaNd  9.25  -5.8# describe>> df.describe()        one        twocount   3.000000   2.000000mean    3.083333   -2.900000std     3.493685   2.262742min     0.750000   -4.500000max     7.100000   -1.300000

描述和汇总统计

方法 说明 count 非NA值的数量 describe 针对series或各DataFrame列计算汇总统计 min、max 最大最小值 argmin、argmax 能够获取到最小最大值的索引位置 idxmin、idxmax 能够获取到最小最大值的索引值 quantile 计算样本的分位数(0到1) sum 总和 mean 平均值 median 算术中位数 mad 根据平均值计算平均绝对离差 var 样本值的方差 std 样本值的标准差 skew 样本值的偏度(三阶矩) kurt 样本值的峰度(四阶) cumsum 累计和 cummin、cummax 累计最大值和累计最小值 cumprod 累计积 diff 计算一阶差分(对时间序列很有用) pct_change 计算百分数变化

3. 唯一值、值计数以及成员资格

obj = Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])# 唯一值>> obj.unique()array([c, a, d, b], dtype=object)# 值计数>> obj.value_counts()c  3a  3b  2d  1# 判断矢量化集合的成员资格>> obj.isin(['b', 'c'])0 True1 False2 False3 False4 False5 True6 True7 True8 True

处理缺失值

from numpy import nan as NAdata = DataFrame([[1, 6.5, 3], [1, NA, NA],                 [NA, NA, NA],[NA, 6.5, 3]])cleaned = data.dropna()>> data   0    1    20  1    6.5  31  1    NaN  NaN2  NaN  NaN  NaN3  NaN  6.5  3>> cleand   0    1    20  1    6.5  3# how=all 丢弃全为Na的行>> data.dropna(how='all')   0    1    20  1    6.5  31  1    NaN  NaN3  NaN  6.5  3# thresh>> data.dropna(thresh=3)  # 一行中有3个值非空,就保留   0    1    20  1    6.5  3# fillna>> data.fillna(0)   0    1    20  1    6.5  31  1    0    02  0    0    03  0    6.5  3# 对不同列填充不同值>> data.fillna({1: 0.5, 2: -1})   0    1    20  1    6.5  31  1    0.5  -12  NaN  0.5  -13  NaN  6.5  3# method='ffill'>> data.fillna(method='ffill', limit=2)   0    1    20  1    6.5  31  1    6.5  32  1    6.5  33  1    6.5  3>> data.fillna(data.mean())

fillna函数的参数

参数 说明 value 用于填充缺失值的标量值或字典对象 method 插值方式,默认ffill axis 待填充的轴,默认axis=0 inplace 修改调用者对象而不产生副本 limit 对于前向或后向填充,可以连续填充的最大数量

层次化索引

1. 内外层数据选取

data = Series(np.random.randn(10),             index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd', 'd'],                   [1, 2, 3, 1, 2, 3, 1, 2, 2, 3]])>> dataa  1  0.670216   2  0.852965   3  -0.955869b  1  -0.023493   2  -2.304234   3  -0.652469c  1  -1.218302   2  -1.332610d  2  1.074623   3  0.723642>> data['b']1  -0.0234932  -2.3042343  -0.652469>> data.ix[['b', 'd']]b  1  -0.023493   2  -2.304234   3  -0.652469d  2  1.074623   3  0.723642# 在内层选取>> data[:, 2]a  0.852965b  -2.304234c  -1.332610d  1.074623

2. 数据重塑

>> data.unstack()    1          2          3a   0.670216   0.852965   -0.955869b   -0.023493  -2.304234  -0.652469c   -1.218302  -1.332610  NaNd   NaN        1.074623   0.723642>> data.unstack().stack()a  1  0.670216   2  0.852965   3  -0.955869b  1  -0.023493   2  -2.304234   3  -0.652469c  1  -1.218302   2  -1.332610d  2  1.074623   3  0.723642

3. 重排分级顺序

有时需要重新调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。

swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象。

frame = DataFrame(np.arange(12).reshape((4, 3)),                 index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],                 columns=[['Ohio', 'Ohio', 'Colorado'],                         ['Green', 'Red', 'Green']])frame.index.names = ['key1', 'key2']frame.columns.names = ['state', 'color']>> framestate         Ohio          Coloradocolor         Green  Red    Greenkey1  key2    a     1       0      1      2      2       3      4      5b     1       6      7      8      2       9      10     11>> frame.swaplevel('key1', 'key2')state         Ohio          Coloradocolor         Green  Red    Greenkey2  key1    1     a       0      1      22     a       3      4      51     b       6      7      82     b       9      10     11# sortlevel根据单个级别中的值对数据排序>> frame.sortlevel(1)state         Ohio          Coloradocolor         Green  Red    Greenkey1  key2    a     1       0      1      2b     1       6      7      8a     2       3      4      5b     2       9      10     11>> frame.swaplevel(0, 1).sortlevel(0)state         Ohio          Coloradocolor         Green  Red    Greenkey2  key1    1     a       0      1      2      b       6      7      82     a       3      4      5      b       9      10     11

4. 根据级别汇总统计

>> frame.sum(level='key2')state    Ohio          Coloradocolor    Green  Red    Greenkey2     1        6      8      102        12     14     16>> frame.sum(level='color', axis=1)color         Green  Red    key1  key2    a     1       2      1           2       8      4      b     1       14     7            2       20     10