Pandas常用功能

重新索引

reindex基本用法

obj = Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c'])
>> obj
d 4.5
b 7.2
a -5.3
c 3.6
obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=0)
>> obj2
a -5.3
b 7.2
c 3.6
d 4.5
e 0.0
obj3 = Series(['blue', 'purple', 'yellow'], index=[0, 2, 4])
obj3.reindex(range(6), method='ffill')
>> obj3
0 bule
1 bule
2 purple
3 purple
4 yellow
5 yellow

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

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

reindex函数的参数

参数说明
index用作索引的新序列
methodfill,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   four
Utah       8     9     10      11
New York   12    13    14      15
>> data.drop(['two', 'four'], axis=1)
           one   three
Ohio       0     2     
Colorado   4     6
Utah       8     10
New 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  four
Ohio       0     1     2      3
Colorado   4     5     6      7
Utah       8     9     10     11
New York   12    13    14     15
# obj[val]
>> data[['three', 'one']]
           three  one
Ohio       2      0
Colorado   6      4
Utah       10     8
New York   14     12
>> data[:2]
           one   two   three  four
Ohio       0     1     2      3
Colorado   4     5     6      7
>> data[data['three'] > 5]
           one   two   three  four
Colorado   4     5     6      7
Utah       8     9     10     11
New York   12    13    14     15
# obj.ix[val]
>> data.ix['Colorado', ['two', 'three']]
two    5
three  6
Name: Colorado
>> data.ix[['Colorado', 'Utah'], [3, 0, 1]]
           four  one   two   
Colorado   7     4     5     
Utah       11    8     9  
>> data.ix[2]
one    8
two    9
three  10
four   11
Name: 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  d
Ohio      0  1  2
Texas     3  4  5
Colorado  6  7  8
>> df2
          b  d  e
Utah      0  1  2
Ohio      3  4  5
Texas     6  7  8
Oregon    9  10 11
>> df1 + df2
          b    c    d    e
Colorado  NaN  NaN  NaN  NaN
Ohio      3    NaN  6    NaN
Oregon    NaN  NaN  NaN  NaN
Texas     9    NaN  12   NaN
Utah      NaN  NaN  NaN  NaN
1. 填充缺失值
>> df1.add(df2,fill_value=0)
          b    c    d    e
Colorado  6    7    8    0
Ohio      3    1    6    5
Oregon    9    0    10   11
Texas     9    4    12   8
Utah      0    0    1    2
2. 算术方法
方法说明
add加法运算
sub减法运算
div除法运算
mul乘法运算

ufuns

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

# 求绝对值
>> np.abs(df1)
          b  c  d
Ohio      0  1  2
Texas     3  4  5
Colorado  6  7  8
# apply方法
f = lambda x: x.max() - x.min()
>> df1.apply(f)
b 6
c 6
d 6
>> df1.apply(f, axis=1)
Ohio     2
Texas    2
Colorado 2
# 传递给apply的函数可以返回由多个值组成的series
def f(x):
  return Series([x.min(), x.max()], index=['min', 'max'])
>> df1.apply(f):
     b  c  d
min  0  1  2
max  6  7  8
# applymap方法
# 得到dataframe中各个浮点值的格式化字符串
format = lambda x: '%.2f' % x
frame.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  c
one  4  5  6  7
two  0  1  2  3
# 设置axis对columns排序
>> frame.sort_index(axis=1)
     a  b  c  d
two  1  2  3  0
one  5  6  7  4
# 默认升序排序,设置降序
frame.sort_index(axis=1, ascending=False)
# 根据一个或多个列的中的值进行排序
frame.sort_index(by='b')
     d  a  b  c
two  0  1  2  3
one  4  5  6  7
2. rank
obj = Series([7, -5, 7, 4, 2, 0, 4])
>> obj.rank()
0 6.5
1 1.0
2 6.5
3 4.5
4 3.0
5 2.0
6 4.5
>> obj.rank(method='first')
0 6
1 1
2 7
3 4
4 3
5 2
6 5
# 降序排
obj.rank(ascending=False, method='max')
# 在列计算排名
obj.rank(axis=1)

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

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

汇总和计算描述统计

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

约简方法的选项

选项说明
axis轴,行用0,列用1
skipna排除缺失值,默认为True
level如果轴式层次化索引的(MultiIndex),则根据level分组
2. 描述和汇总
# 达到最小值或最大值的索引
>> df.idxmax()
one  b
two  a
# 累计型
>> df.cumsum()
   one   two
a  1.4   NaN
b  8.5   -4.5
c  NaN   NaN
d  9.25  -5.8
# describe
>> df.describe()
        one        two
count   3.000000   2.000000
mean    3.083333   -2.900000
std     3.493685   2.262742
min     0.750000   -4.500000
max     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  3
a  3
b  2
d  1
# 判断矢量化集合的成员资格
>> obj.isin(['b', 'c'])
0 True
1 False
2 False
3 False
4 False
5 True
6 True
7 True
8 True

处理缺失值

from numpy import nan as NA
data = DataFrame([[1, 6.5, 3], [1, NA, NA],
                 [NA, NA, NA],[NA, 6.5, 3]])
cleaned = data.dropna()
>> data
   0    1    2
0  1    6.5  3
1  1    NaN  NaN
2  NaN  NaN  NaN
3  NaN  6.5  3
>> cleand
   0    1    2
0  1    6.5  3
# how=all 丢弃全为Na的行
>> data.dropna(how='all')
   0    1    2
0  1    6.5  3
1  1    NaN  NaN
3  NaN  6.5  3
# thresh
>> data.dropna(thresh=3)  # 一行中有3个值非空,就保留
   0    1    2
0  1    6.5  3
# fillna
>> data.fillna(0)
   0    1    2
0  1    6.5  3
1  1    0    0
2  0    0    0
3  0    6.5  3
# 对不同列填充不同值
>> data.fillna({1: 0.5, 2: -1})
   0    1    2
0  1    6.5  3
1  1    0.5  -1
2  NaN  0.5  -1
3  NaN  6.5  3
# method='ffill'
>> data.fillna(method='ffill', limit=2)
   0    1    2
0  1    6.5  3
1  1    6.5  3
2  1    6.5  3
3  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]])
>> data
a  1  0.670216
   2  0.852965
   3  -0.955869
b  1  -0.023493
   2  -2.304234
   3  -0.652469
c  1  -1.218302
   2  -1.332610
d  2  1.074623
   3  0.723642
>> data['b']
1  -0.023493
2  -2.304234
3  -0.652469
>> data.ix[['b', 'd']]
b  1  -0.023493
   2  -2.304234
   3  -0.652469
d  2  1.074623
   3  0.723642
# 在内层选取
>> data[:, 2]
a  0.852965
b  -2.304234
c  -1.332610
d  1.074623
2. 数据重塑
>> data.unstack()
    1          2          3
a   0.670216   0.852965   -0.955869
b   -0.023493  -2.304234  -0.652469
c   -1.218302  -1.332610  NaN
d   NaN        1.074623   0.723642
>> data.unstack().stack()
a  1  0.670216
   2  0.852965
   3  -0.955869
b  1  -0.023493
   2  -2.304234
   3  -0.652469
c  1  -1.218302
   2  -1.332610
d  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']
>> frame
state         Ohio          Colorado
color         Green  Red    Green
key1  key2    
a     1       0      1      2
      2       3      4      5
b     1       6      7      8
      2       9      10     11
>> frame.swaplevel('key1', 'key2')
state         Ohio          Colorado
color         Green  Red    Green
key2  key1    
1     a       0      1      2
2     a       3      4      5
1     b       6      7      8
2     b       9      10     11
# sortlevel根据单个级别中的值对数据排序
>> frame.sortlevel(1)
state         Ohio          Colorado
color         Green  Red    Green
key1  key2    
a     1       0      1      2
b     1       6      7      8
a     2       3      4      5
b     2       9      10     11
>> frame.swaplevel(0, 1).sortlevel(0)
state         Ohio          Colorado
color         Green  Red    Green
key2  key1    
1     a       0      1      2
      b       6      7      8
2     a       3      4      5
      b       9      10     11
4. 根据级别汇总统计
>> frame.sum(level='key2')
state    Ohio          Colorado
color    Green  Red    Green
key2     
1        6      8      10
2        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     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值