pandas学习(五)

A 排序(按照索引index)

在Series和DataFrame中,如果按照row或column 的index来排序的话,可以使用sort_index()方法来排序,默认排序是按row index。如果要按column index 排序,那么sort_inde(axis=1)

import numpy as np
import pandas as pd

obj=pd.Series(range(4),index=['d','b','c','a'])
print(obj.sort_index())

#输出:
a    3
b    1
c    2
d    0

#可以看出按照index 排序

#对于DataFrame:
frame=pd.DataFrame(np.arange(12.).reshape(3,4),columns=list('deab'),index=['three','one','two'])
print(frame)

#输出:
        d    e     a     b
three  0.0  1.0   2.0   3.0
one    4.0  5.0   6.0   7.0
two    8.0  9.0  10.0  11.0

print(frame.sort_index())

#输出:
        d    e     a     b
one    4.0  5.0   6.0   7.0
three  0.0  1.0   2.0   3.0
two    8.0  9.0  10.0  11.0

#可以从结果看出来是默认是按照row index 从大到小排序的

print(frame.sort_index(axis=1))

#输出:
         a     b    d    e
three   2.0   3.0  0.0  1.0
one     6.0   7.0  4.0  5.0
two    10.0  11.0  8.0  9.0

#从结果知道是按照column index 大小排序的





sort_index()默认是升序,sort_index(axis=1,ascending=False) 是降序排序

print(frame.sort_index(axis=1,ascending=False))

#输出:
        e    d     b     a
three  1.0  0.0   3.0   2.0
one    5.0  4.0   7.0   6.0
two    9.0  8.0  11.0  10.0

B排序(按照值)

sort_values()

1.
obj=pd.Series([4,-7,3,2])
print(obj)
print(obj.sort_values())
print(obj.sort_values(ascending=False))

#输出:
0    4
1   -7
2    3
3    2
dtype: int64
1   -7
3    2
2    3
0    4
dtype: int64
0    4
2    3
3    2
1   -7
dtype: int64

如果一个数据有缺失值,会把缺失值排在最后!

obj1=pd.Series([4,np.nan,-7,np.nan,3,2])
print(obj1)
print(obj1.sort_values())
print(obj1.sort_values(ascending=False))

#输出:
0    4.0
1    NaN
2   -7.0
3    NaN
4    3.0
5    2.0
dtype: float64
2   -7.0
5    2.0
4    3.0
0    4.0
1    NaN
3    NaN
dtype: float64
0    4.0
4    3.0
5    2.0
2   -7.0
1    NaN
3    NaN
dtype: float64

对于DataFrame,可以用一列或者多列作为sort keys(排序的键值)

frame1=pd.DataFrame({'b': [4, 7, -3, 2], 'a': [0, 1, 0, 1]})
print(frame1)
print(frame1.sort_values(by=['b']))
print(frame.sort_values(by=['a','b']))

#输出:
  a  b
0  0  4
1  1  7
2  0 -3
3  1  2
   a  b
2  0 -3
3  1  2
0  0  4
1  1  7
         d    e     a     b
three  0.0  1.0   2.0   3.0
one    4.0  5.0   6.0   7.0
two    8.0  9.0  10.0  11.0

Rank排名,给有效的数据分配数字。数字代表这个index 以前指向的数据在整个原来的Series中排名是多少。

obj2=pd.Series([7, -5, 7, 4, 2, 0, 4])
print(obj2)
print(obj2.sort_values())
print(obj2.rank())

#输出:
0    7
1   -5
2    7
3    4
4    2
5    0
6    4
dtype: int64
1   -5
5    0
4    2
3    4
6    4
0    7
2    7
dtype: int64
0    6.5
1    1.0
2    6.5
3    4.5
4    3.0
5    2.0
6    4.5
dtype: float64

#从第三个结果中可以看出来,后面的浮点数数值代表的是index 0 指向的
#的数据7在所有数据里面排名6.5,这是因为整个Series中有2个7,分别排名第6名
#和第7名,所以默认取平均值6.5,同上,4排名第4名和第5名,所以取平均值4.5
#(排名从第1名开始,没有第0名)

所以从rank中找到排名在根据index对应的数据,就能清楚这个数据在整个数据是排名多少了。

rank还可以根据数据被排序后观测到的顺序进行排名:

print(obj2)
print(obj2.rank(method='first'))

#输出:
0    7
1   -5
2    7
3    4
4    2
5    0
6    4
dtype: int64
0    6.0
1    1.0
2    7.0
3    4.0
4    3.0
5    2.0
6    5.0
dtype: float64

#可以看出这是根据obj2按从小到大的数值大小排序,然后根据观测到数据的先后进行排名的.

print(obj2.rank(ascending=False,method='first')) #降序

#输出:

0    1.0
1    7.0
2    2.0
3    3.0
4    5.0
5    6.0
6    4.0

DataFrame也可以根据行或列来计算rank()

frame2=pd.DataFrame({'b': [4.3, 7, -3, 2],
                      'a': [0, 1, 0, 1],
                      'c': [-2, 5, 8, -2.5]})
print(frame2)

#输出:
  a    b    c
0  0  4.3 -2.0
1  1  7.0  5.0
2  0 -3.0  8.0
3  1  2.0 -2.5

print(frame2.rank(axis='columns'))

#输出:
    a    b    c
0  2.0  3.0  1.0
1  1.0  3.0  2.0
2  2.0  1.0  3.0
3  2.0  3.0  1.0

C.有重复label的轴索引

我们看到的所有例子索引都是不重复的,唯一的轴标签(索引值)。一些pandas函数(reindex),需要label是唯一的,但这并是不强制的。比如下面有一个重复的索引:

obj3 = pd.Series(range(5), index=['a', 'a', 'b', 'b', 'c'])
print(obj3)
#输出:
a    0
a    1
b    2
b    3
c    4
dtype: int64

#index的is_unique特性能返回index 的label 是否唯一

print(obj3.index.is_unique)

#输出:
False

#数据选择对于重复label则表现有点不同。如果一个label有多个值,那么就会返回一个series, 如果是label只对应一个值的话,会返回一个标量

print(obj3['a'])

#输出:

a    0
a    1

print(obj3['c'])

#输出:
4

对于DataFrame:

#这个选择的逻辑也应用于DataFrame:
df = pd.DataFrame(np.random.randn(4, 3), index=['a', 'a', 'b', 'b'])
print(df)
#输出:

      0         1         2
a  1.350684 -0.791739  2.318765
a -0.559660  1.141115 -0.447092
b -0.622946 -1.342305  1.158423
b  0.646948  1.533911 -0.551540

print(df.loc['b']) 

#输出:
        0         1         2
b  0.612960  1.053828  0.167829
b -0.116479  0.115436 -0.418042

记住对于DataFrame 用行索引, 要用loc[] 或则ilco[]!!!!!!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值