Reindexing(重新索引)
- 重新索引可以按照指定的索引顺序排列数据,如果没有该索引则显示为NaN
例:
obj = pd.Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c'])
obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'])
a -5.3
b 7.2
c 3.6
d 4.5
e NaN
dtype: float64
- 处理时间序列这样的数据时,我们可能需要在reindexing的时候需要修改值。method选项能做到这一点,比如设定method为ffill:
obj3 = pd.Series(['bule', 'purple', 'yellow'], index=[0, 2, 4])
obj3.reindex(range(6), method='ffill')
0 bule
1 bule
2 purple
3 purple
4 yellow
5 yellow
dtype: object
注:bfill向后填充,ffill向前填充
总结:
- 更改行索引
语法:
数据框名.reindex(索引数组,method)
- 更改列索引
语法:
数据框名.reindex(columns=索引数组,method)
- 使用loc更改索引,可以同时更改行和列索引
frame.loc[行索引,列索引]
列名重命名
- df.columns = new_columns
一次性对所有列名重命名,new_coumns 可以是列表或元组, 但新旧列名的长度必须一致 - df = df.rename(columns=dict)
dict是字典,key为旧列名,value为新列名;这种方法可以只改部分列名
按轴删除记录
- drop可以不返回一个新的object,而是直接更改series or dataframe in-place,此时在函数内部设置参数inplace=True即可
Series
对于series,drop会返回一个新的object,并删去指定的axis的值
obj = pd.Series(np.arange(5.), index=['a', 'b', 'c', 'd', 'e'])
new_obj = obj.drop('c')
#若要删除多个,则可以将索引写在数组里
a 0.0
b 1.0
d 3.0
e 4.0
dtype: float64
Dataframe
对于DataFrame,能按行或列的axis来删除
语法:
#按照行删除
数据框名.drop(单个label|label序列)
#按照列删除
数据框名.drop(单个label|label序列, axis=1|axis='columns')
例:直接删除表中第二,四列数据
data = pd.DataFrame(np.arange(16).reshape(4, 4),
index=['Ohio', 'Colorado', 'Utah', 'New York'],
columns=['one', 'two', 'three', 'four'])
data.drop(['two', 'four'], axis='columns', inplace=True)
索引
series切片
与python比较:
- 相同点
series不仅可以用python的方式——即整数,还可以用定义的label,调取切片,使用方法照旧
例:提取第二个元素
obj['b']
obj[1]
例:提取大于2 的元素
obj[obj >2]
- 不同点
用label来slicing(切片)的时候,和python的切片不一样的在于,会包括尾节点(python前闭后开)
Dataframe切片
- dataframe的indexing可以是布尔数组:
data[data['three'] > 5]
#筛选出第三列元素大于5的数据
- boolean dataframe:
data<5
#可以得到一个逻辑值数据框
data[data < 5] = 0
#可以将所有小于5的数据变成0
- 如果要选择行,则直接填入一组数,若要选择列则传入一个list
data[:2]
#选择前两行
data[[:2]]
#选择前两列
- indexing可以通过一个值或序列,选中一个以上的列
data[['three', 'one']]
#选择第三、一列
loc和iloc
loc and iloc是种特别的索引符. 这两个方法能通过axis labels(loc)或integer(iloc),来选择行或列,用法和上面一样;除此之外还可以同时筛选行和列
- loc
例:
data
one two three four
Ohio 0 0 0 0
Colorado 0 5 6 7
Utah 8 9 10 11
New York 12 13 14 15
data.loc['Colorado', ['two', 'three']]
two 5
three 6
Name: Colorado, dtype: int32
- iloc
data.iloc[2, [3, 0, 1]]
four 11
one 8
two 9
Name: Utah, dtype: int32
- 切片
用法和一般切片是一样的,但是注意:loc包含结尾,iloc不包含结尾,即前者闭区间,后者前闭后开
例:
data.loc[:'Utah', 'two']
data.iloc[:, :3][data.three > 5] #在选出前三列(0,1,2)的基础上,筛选第三列值大于5的行
整数索引的注意事项
- 因为series和dataframe都自带labels(index),如果不做额外设定,则默认整数索引。此时,当我们类似python中使用-1表示最后一个元素时,则会产生歧义,使得程序报错:
ser = pd.Series(np.arange(3.))
ser
0 0.0
1 1.0
2 2.0
dtype: float64
ser[-1] #报错
所以若要避免这类问题最好用非整数做索引,避免歧义。
- 如果axis index里包含integer,那么选择数据的时候,就会是label-orented. 为了更精确地选择,使用loc(for label)或ilco(for integers)
算术和数据对齐
数据对齐
不同index的obejct之间的算术计算。如果两个object相加,但他们各自的index并不相同,最后结果得到的index是这两个index的合集:即index相同的照常进行计算,不同的就看做值+NaN=NaN
例:
s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index=['a', 'c', 'd', 'e'])
s2 = pd.Series([2.1, 3.6, -1.5, 4, 3.1], index=['a', 'c', 'e', 'f', 'g'])
s1+s2
a 9.4
c 1.1
d NaN
e 0.0
f NaN
g NaN
dtype: float64
- 上述数据对齐规则在series中仅表现为index上,dataframe中则要求行和列要同时保持对齐
- 这种数据对齐方式会引入很多缺失数据
算术
- 加法:add代替+,可以在算术后增加填充功能,将NaN填充为想要的值
语法:数据框名.add(数据框名2, fill_value=值) - 除法:k/数据框 或 数据框.rdiv(k)
- 普通的加减乘除均会
DataFrame和Series之间的操作(broadcasting)
- broadcasting down the rows(向下按行广播)
例:
frame = pd.DataFrame(np.arange(12.).reshape((4, 3)),
columns=list('bde'),
index=['Utah', 'Ohio', 'Texas', 'Oregon'])
series = frame.iloc[0]
frame - series
b d e
Utah 0.0 0.0 0.0
Ohio 3.0 3.0 3.0
Texas 6.0 6.0 6.0
Oregon 9.0 9.0 9.0
上述算术中,series的列与frame的列相匹配,从而计算结果是frame的每一行都减了一次series
- broadcasting down the columns(向下按列广播)
若要按列广播则必须使用算术方法即:使用sub并且参数axis=0或axis=‘index’
series1 = frame['d']
frame.sub(series1, axis='index')
- 注意,当出现index不完全匹配时,依旧会出现上述所提的数据对齐问题