pandas数据操作
索引操作:
-
series索引
-
ser_obj[‘label’] 通过索引名称访问
-
ser_obj[pos] 索引位置访问
import pandas as pd ser_obj = pd.Series(range(5), index = ['a', 'b', 'c', 'd', 'e']) print(ser_obj.head()) print('--------------') # 行索引 print('通过索引名称:',ser_obj['a']) print('--------------') print('通过索引位置:',ser_obj[0])
运行结果:
-
-
切片访问 ser_obj[2:4] ser_obj[‘label1’ : ‘label3’]
-
按索引名切片时是包含终止索引的
# 切片索引 print('通过索引位置:\n',ser_obj[1:3]) print('--------------') print('通过索引名称切片是包含终止索引:\n',ser_obj['b':'d'])
运行结果:
-
-
不连续索引 ser_obj[[‘label1’, ‘label2’, ‘label3’]] ser_obj[[pos1, pos2, pos3]]
# 不连续索引 print(ser_obj[[0, 2, 4]]) print('--------------') print(ser_obj[['a', 'e']])
运行结果:
-
布尔索引
# 布尔索引 ser_bool = ser_obj > 2 print(ser_bool) print('--------------') print(ser_obj[ser_bool]) print('--------------') print(ser_obj[ser_obj > 2])
运行结果:
-
dataframe索引
-
列索引 df_obj[‘label’]
import numpy as np df_obj = pd.DataFrame(np.random.randn(5,4), columns = ['a', 'b', 'c', 'd']) print(df_obj.head()) # 列索引 print('--------------') print('列索引') print(df_obj['a']) # 返回Series类型
运行结果:
-
-
不连续索引
-
df_obj[[‘label1’, ‘label2’]]
# 不连续索引 print(df_obj[['a','c']])
运行结果:
-
索引操作总结:
-
pandas索引可归纳为3种
-
.loc 标签索引
# 标签索引 loc # Series print(ser_obj['b':'d']) print('--------------') print(ser_obj.loc['b':'d']) print('--------------') # DataFrame print(df_obj['a']) print('--------------') print(df_obj.loc[0:2, 'a'])
运行结果:
-
.iloc 位置索引
# 整型位置索引 iloc print(ser_obj[1:3]) print('--------------') print(ser_obj.iloc[1:3]) print('--------------') # DataFrame print(df_obj.iloc[0:2, 0]) # 注意和df_obj.loc[0:2, 'a']的区别
运行结果:
-
.ix 标签与位置混合索引
-
先按标签索引尝试操作,然后按位置索引尝试操作
# 混合索引 ix print(ser_obj.ix[1:3]) print('--------------') print(ser_obj.ix['b':'c']) print('--------------') # DataFrame print(df_obj.ix[0:2, 0]) # 先按标签索引尝试操作,然后再按位置索引尝试操作
运行结果:
-
-
-
dataframe索引时可将其看作ndarray操作
-
标签的切片索引是包含末尾位置
运算与对齐:
-
按索引对齐运算,没对齐的位置补NaN
-
series 按行索引对齐
s1 = pd.Series(range(10, 20), index = range(10)) s2 = pd.Series(range(20, 25), index = range(5)) print('s1: ') print(s1) print('--------------') print('s2: ') print(s2) print('--------------') # Series 对齐运算 s1 + s2
运行结果:
-
dataframe按行、列索引对齐
import numpy as np df1 = pd.DataFrame(np.ones((2,2)), columns = ['a', 'b']) df2 = pd.DataFrame(np.ones((3,3)), columns = ['a', 'b', 'c']) print('df1: ') print(df1) print('--------------') print('df2: ') print(df2) print('--------------') # DataFrame对齐操作 df1 + df2
运行结果:
-
-
填充未对齐的数据进行计算
-
使用add,sub,div,mul
# 填充未对齐的数据进行运算 print(s1) print('--------------') print(s2) print('--------------') s1.add(s2, fill_value = -1)
运行结果:
-
同时通过fill_value指定填充值
print(df1) print('--------------') print(df2) df1.sub(df2, fill_value = 5.)
运行结果:
-
-
填充NaN
-
fillna
s3_filled = s3.fillna(-1) print(s3_filled)
运行结果:
-
函数应用:
-
可直接使用numpy的ufunc函数,如abs等
# Numpy ufunc 函数 df = pd.DataFrame(np.random.randn(5,4) - 1 ) print(df) print('--------------') print(np.abs(df))
运行结果:
-
通过apply将函数应用到行或列上
-
轴的方向默认axis=0(列)
# 使用apply应用行或列数据 print(df.apply(lambda x : x.max()))
运行结果:
-
-
通过applymap将函数应用到每个数据上
# 使用applymap应用到每个数据 f2 = lambda x : '%.2f' % x print(df.applymap(f2))
运行结果:
排序:
-
sort_index 索引排序
s4 = pd.Series(range(10, 15), index = np.random.randint(5, size=5)) print(s4) print('--------------') # 索引排序 s4.sort_index()
运行结果:
-
对dataframe操作时注意轴的方向
df4 = pd.DataFrame(np.random.randn(3, 4), index=np.random.randint(3, size=3), columns=np.random.randint(4, size=4)) print(df4)
运行结果:
-
-
按值排序
-
sort_values(by = ‘label’)
# 按值排序 df4.sort_values(by=1)
运行结果:
-
处理缺失数据:
-
判断是否存在缺失值
df_data = pd.DataFrame([np.random.randn(3), [1., np.nan, np.nan], [4., np.nan, np.nan], [1., np.nan, 2.]]) print(df_data.head()) # isnull df_data.isnull()
运行结果:
- ser_obj.isnull() df_obj.isnull()
-
dropna 丢弃缺失值,可指定轴
# dropna df_data.dropna()
运行结果:
-
fillna 填充缺失值
# fillna df_data.fillna(-1.)
运行结果: