numpy 的通用函数(逐元素数组方法)对pandas 同样有效。通用函数 脑补链接
frame = pd.DataFrame(np.random.randn(4,3),columns=list('bde'),index=['utah','ohio','texas','oregon'])
frame
b d e
utah -0.794479 -0.739367 -0.965423
ohio -0.657556 -1.990293 0.732611
texas 0.493048 1.346761 -0.890091
oregon -0.590841 0.785932 0.707483
np.abs(frame)
b d e
utah 0.794479 0.739367 0.965423
ohio 0.657556 1.990293 0.732611
texas 0.493048 1.346761 0.890091
oregon 0.590841 0.785932 0.707483
# 将函数应用到一行或一列的一维数组上,使用 apply 这个功能。
f=lambda x : x.max() - x.min() # 获得最大最小值的差值
frame.apply(f) # 每一列都会调用一次
b 1.287527
d 3.337054
e 1.698034
dtype: float64
frame.apply(f,axis='columns') # 对每行调用一次,,这个axis 就很迷,,,匹配列,对行调用。。。
# 大部分最常用的数组统计(比如sum mean) 都是dataframe 的方法,所以计算统计值时使用apply 并不是必须的
# 传递给apply 的函数并不一定要返回一个标量值,也可以返回带有多个值的 series
def f(x):
return pd.Series([x.min(),x.max()],index=['min','max'])
frame.apply(f) # 额,,有点搞不清这是对列还是对行了。。。
b d e
min -0.794479 -1.990293 -0.965423
max 0.493048 1.346761 0.732611
# 逐元素的python 函数也可以使用,applymap() 方法
format=lambda x:'%.2f' % x # 格式化成两位小数
frame.applymap(format)
b d e
utah -0.79 -0.74 -0.97
ohio -0.66 -1.99 0.73
texas 0.49 1.35 -0.89
oregon -0.59 0.79 0.71
# series 也有个 map 函数,用来将一个逐元素的函数应用到 series 上
frame['e'].map(format)
utah -0.97
ohio 0.73
texas -0.89
oregon 0.71
Name: e, dtype: object # 以上这些方法都不会修改原对象 frame 的
根据某些准则对数据集进行排序时另一个重要的内建操作,如需按行或列索引进行字典型排序,需要使用 sort_index 方法,该方法返回一个新的、排序好的对象。
obj=pd.Series(range(4),index=['d','a','b','c'])
obj.sort_index()
a 1
b 2
c 3
d 0
dtype: int64
frame=pd.DataFrame(np.arange(8).reshape((2,4)),index=['three','one'],columns=['d','a','b','c'])
frame.sort_index()
d a b c
one 4 5 6 7
three 0 1 2 3
frame.sort_index(axis=1,ascending=False) # 默认时升序,ascending 调成降序
d c b a
three 0 3 2 1
one 4 7 6 5
obj=pd.Series([4,7,np.nan,-3,2])
obj.sort_values() # 对值进行排序,默认情况下,nan 会排到最后
3 -3.0
4 2.0
0 4.0
1 7.0
2 NaN
dtype: float64
# 当对dataframe 排序时,要传递 by 这个参数,可以使用一列或多列作为排序键。
frame=pd.DataFrame({'b':[4,7,-3,2],'a':[0,9,5,3],'c':[6,9,3,2]})
frame
b a c
0 4 0 6
1 7 9 9
2 -3 5 3
3 2 3 2
frame.sort_values(by=['a','b']) # 传递 by 这个参数就行,注意传递多个以第一个的索引为准,这里b 就没排好
b a c
0 4 0 6
3 2 3 2
2 -3 5 3
1 7 9 9
排名是指对数组从1到有效数据点总数分配名次的操作。series 和 dataframe 的rank 方法时实现排名的,默认情况下,rank 通过将平均排名分配到每个组来打破平级关系。
obj=pd.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
dtype: float64
obj.rank(method='first') # 根据数据中的观察顺序进行排序
0 6.0
1 1.0
2 7.0
3 4.0
4 3.0
5 2.0
6 5.0
dtype: float64
obj.rank(method='max',ascending=False) # 将值分配给组中的最大排名。。。怎么这么讲究。。。
0 2.0
1 7.0
2 2.0
3 4.0
4 5.0
5 6.0
6 4.0
dtype: float64
frame=pd.DataFrame({'b':[4.3,7,-3,2],'a':[0,1,0,1],'c':[-2,5,8,-2.5]})
frame
b a c
0 4.3 0 -2.0
1 7.0 1 5.0
2 -3.0 0 8.0
3 2.0 1 -2.5
frame.rank(axis='columns')
b a c
0 3.0 2.0 1.0
1 3.0 1.0 2.0
2 1.0 2.0 3.0
3 3.0 2.0 1.0
frame=pd.DataFrame(np.arange(12).reshape((3,4)),index=['three','one','three'],columns=['d','a','b','c'])
frame.loc['three']
d a b c
three 0 1 2 3
three 8 9 10 11
就是对于重复标签的索引会都提出来。。。这个索引真是给我整蒙了。。。。