01 重建索引
reindex是pandas对象的重要方法。该方法用于创建一个符合新索引的新对象。
import pandas as pd
obj = pd.Series([4.5, 7.2, -5.3, 3.6],
index=['d','b','a','c'])
print(obj)
Series调用reindex方法会按新索引重新排列。
obj2 = obj.reindex(['a','b','c','d','e'])
print(obj2)
fill向前填充数据,bfill向后填充数据:
obj3 = pd.Series(['blue','purple','yellow'],
index=[0, 2, 4])
print(obj3)
print(obj3.reindex(range(6),method='ffill'))
在DataFrame中,reindex方法的index关键字可以改变行索引,columns关键字可以改变列索引。
可以使用loc进行简洁的标签索引。
02 轴向上删除条目
drop方法会返回一个含有指示值或轴向上删除值的新对象:
obj = pd.Series(np.arange(5.),index=['a', 'b', 'c', 'd', 'e'])
print(obj)
new_obj = obj.drop('c')
print(new_obj)
在DataFrame中调用drop会删除行标签上的值,可以通过传递axis=1
或者axis='columns'
来从列中删除值,如下:
data = pd.DataFrame(np.arange(16).reshape((4, 4)),
index=['Ohio', 'Colorado', 'Utah', 'New York'],
columns=['one', 'two', 'three', 'four'])
print(data)
# 删除行标签
print(data.drop(['Colorado', 'Ohio']))
# 删除列标签
print(data.drop(['one','three'],axis=1))
print(data.drop('two',axis='columns'))
03 索引、选择与过滤
普通的Python切片是不包含尾部的,Series的切片包含。
DataFrame在行上的标签索引,可以使用loc(轴标签)和iloc(整数标签)。
data1 = pd.DataFrame(np.arange(16).reshape((4, 4)),
index=['Ohio', 'Colorado', 'Utah', 'New York'],
columns=['one', 'two', 'three', 'four'])
print(data1.loc['Colorado', ['two', 'three']])
print(data1.iloc[1, [1, 2]])
也可以使用切片功能。
04 整数索引
为了保持一致性,如果你有一个包含整数的轴索引,数据选择时请始终使用标签索引。
05 算术和数据对齐
在没有交叠的标签位置上,内部数据对齐会产生缺失值。
在两个不同的索引化对象之间进行算术操作时,可能会想要使用特殊值填充。 例如:有df1,df2两个数据,两者行或列不完全相同,那么将两者添加到一起会导致在一些不重叠的位置出现NA值。
可以使用df1.add(df2,fill_value=0)
这些出现NA值的地方会被以0填充。
表中是Series和DataFrame的算术方法,这些方法中的每一个都有一个以r开头的副本,这些副本方法的参数是翻转的。
因此下面两个语句的结果相等:1/df1
等价于 df1.rdiv(1)
05 函数应用和映射
通常我们需要将函数应用到一行或者一列的一维数组上。DataFrame的apply方法可以实现此功能:
frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utha', 'Ohio', 'Texas', 'Oregon'])
f = lambda x: x.max() - x.min()
# 会被列调用一次
print(frame.apply(f))
如果传递axis='columns'
给apply函数,函数会被每行调用。
如果想操作DataFrame中的每个元素可以使用applymap方法。
06 排序和排名
如果需要按行、列索引进行字典排序,需要使用sort_index方法。该方法返回一个全新的,排序好的对象。
数据默认升序排序,可以使ascending=False
使数据降序。
如果要按Series的值进行排序,使用sort_values
方法。
默认情况下,所有缺失值会被排序至Series的尾部。
当对DataFrame排序时,可以传递一个或多个列名给sort_values的可选参数by。
排名是指对数组从1至有效数据点总数分配名词的操作。rank通过将平均排名分配到每个组来打破平级关系。
obj = pd.Series([7, -5, 7, 4, 2, 0, 4])
print(obj.rank())
排名也可以根据他们在数据中的观察顺序进行分配。
print(obj.rank(method='first'))
下表是可用的平级关系打破方法列表。
DataFrame可以对行或列计算排名。
07 含有重复标签的轴索引
obj = pd.Series(np.arange(5),index=['a', 'a', 'b', 'b', 'c'])
print(obj)
索引的is_unique属性可以告诉你它的标签是否唯一。
print(obj.index.is_unique)
带有重复索引的情况下,根据一个标签索引多个条目会返回一个序列,而单个条目会返回标量值。
这会使得代码更加复杂,因为来自索引的输出类型可能因标签是否重复而有所不同。