重新索引
利用reindex命令可以在原有变量基础上创建新变量
原理上,reindex尽量匹配原有标签带有的值,匹配不上则为NaN
#Series的reindex
obj=pd.Series([4,3,2,1],index=['b','c','d','a'])
print(obj)
obj2=obj.reindex(['a','b','c','d'])
print(obj2)
#时间序列的差值处理(ffill)
obj3=Series(['何塞','阿尔卡蒂奥','布恩迪亚','奥雷里亚诺'],index=[2,3,5,8])
obj4=obj3.reindex(range(10))
print(obj4)#若将index理解为时间,则会发现缺失了一部分数据
obj4=obj3.reindex(range(10),method='ffill')#ffill可以向后填充空缺值
print(obj4)#0,1仍然是NaN
DF既可以修改列也可以修改index
#DataFrame的情况
#基于ndarray生成DF(实际上为加上index与colum)
frame=pd.DataFrame(np.arange(9).reshape([3,3]),
index=['思想性','政治能力','经济能力'],
columns=['斯大林','列宁','戈尔巴乔夫'])
print(frame)
#修改index
frame2=frame.reindex(['思想性','经济能力','政治能力','人格魅力'])
print(frame2)
#修改column,注意要加columns=
frame3=frame.reindex(columns=['列宁','斯大林','勃涅日涅夫','戈尔巴乔夫'])
print(frame3)
reindex相关参数以供查阅
删除相关项
.drop将产生一个新变量
#Series
obj=pd.Series(np.arange(4.),index=['b','c','d','a'])
obj2=obj.drop('c')
obj3=obj.drop(['a','b'])
#DF
frame=pd.DataFrame(np.arange(9).reshape([3,3]),
index=['思想性','政治能力','经济能力'],
columns=['斯大林','列宁','戈尔巴乔夫'])
#drop的是index
frame2=frame.drop(['思想性'])
print(frame2)
#drop为列
frame3=frame.drop(['戈尔巴乔夫'],axis=1)#设置为1即可,columns也行
print(frame3)
print(frame)
#补充:利用inplace = True的参数可以实现就地修改
索引、选取和过滤
Series索引的方式可以是index也可以是行数,也可以是条件判断,这里索引的仍然是原变量映射,直接修改原变量
#Series
#利用标签的切片运算与普通的Python切片运算不同,其末端是包含的:
obj=pd.Series(np.arange(4.),index=['a','b','c','d'])
print(obj[1:2])#一行
print(obj['a':'b'])#两行
#DF
frame=pd.DataFrame(np.arange(9).reshape([3,3]),
index=['思想性','政治能力','经济能力'],
columns=['斯大林','列宁','戈尔巴乔夫'])
print(frame)
#选取指定列
print(frame['列宁'])
#切片选取行
print(frame[1:])
#逻辑判断选取
#选取整体
print(frame[frame>3])#对全体DF判断,不符合的显示NaN
#选取符合条件的行
print(frame[frame['列宁']>3])
如何选取行?⽤loc和iloc进⾏选取
loc:轴标签(坐标定位)
iloc:整数索引
frame=pd.DataFrame(np.arange(9).reshape([3,3]),
index=['思想性','政治能力','经济能力'],
columns=['斯大林','列宁','戈尔巴乔夫'])
#此处用的是中括号,不是小括号
#frame.(i)loc[['index'],['columns']]
print(frame.loc['政治能力',['斯大林','列宁']])
#生成从上往下的表格
print(frame.iloc[2,[0,2]])#经济能力
相关的其他索引方法在此列出以供参阅
整数索引的注意
obj=pd.Series(np.arange(3.))
print(obj[-1])#报错
obj2=pd.Series(np.arange(3.), index=['a', 'b', 'c'])
print(obj2[-1])#2.0
如果轴索引含有整数,数据选取总会使⽤标签,此时用loc来解决
算术运算和数据对⻬
对不同索引的对象进⾏算术运算
一种自动的外连接,重叠处计算,非重叠处则记NaN(不论原来有没有值)
#Series的运算
obj1=pd.Series(np.arange(3.), index=['a', 'b', 'c'])
obj2=pd.Series(np.arange(3.), index=['b', 'c', 'd'])
print(obj1+obj2)
#DF,列行均匹配才能进行运算,否则都是NaN
df1=pd.DataFrame(np.arange(9).reshape([3,3]),
index=['赵','钱','孙'],
columns=list('abc'))
df2=pd.DataFrame(np.arange(9).reshape([3,3]),
index=['钱','孙','李'],
columns=list('bcd'))
print(df1+df2)
也可以使用.add方法运算,将NA处填充值
#通过.add方法将NaN+value变成0+value
print(df1.add(df2,fill_value=0))
注意此处不意味没有NaN,若出现了不存在的搭配则仍然为NaN,例如此处的a李与d赵
其他运算列示以供参考
广播-DF和Series之间的运算
行运算
#DF与Series的广播运算机制
#一般情况
frame=pd.DataFrame(np.arange(12).reshape([4,3]),
index=['思想性','政治能力','经济能力','个人魅力'],
columns=['戈尔巴乔夫','斯大林','列宁'])
print(frame)#4行3列
obj=frame.iloc[0]
print(obj)
print(frame-obj)
#若找不到,匹配的继续运算,匹配不上做NaN
obj2=pd.Series(np.arange(3.),index=['契尔年科','斯大林','列宁'])
print(frame-obj2)
列运算:基于.sub与index参数
#列运算
frame=pd.DataFrame(np.arange(12).reshape([4,3]),
index=['思想性','政治能力','经济能力','个人魅力'],
columns=['戈尔巴乔夫','斯大林','列宁'])
obj3=frame['戈尔巴乔夫']
print(frame.sub(obj3, axis='index'))
排序与rank
利用.sort_index(axis,ascending)按行列排序
默认排的行
#排序
df=pd.DataFrame(np.arange(16).reshape([4,4]),
index=['钱','孙','李','赵'],
columns=list('bacd'))
print(df.sort_index(axis=0,ascending=False))#按照行index降序排序
print(df.sort_index(axis=1,ascending=True))#按照列column顺序排序
利用.sort_value按值排序
#接前文
print(df.sort_values(by=['a', 'b']))#按照ab列数值排序
.rank(method)函数生成“排名表”
#Series
obj = pd.Series([7, -5, 7, 4, 2, 0, 4])
#平均排名(出现重复则一样)
print(obj.rank())
#出现顺序排名(以先后顺序区分一样的值)
print(obj.rank(method='first'))
#降序(最小的值最大排名)
print(obj.rank(ascending=False,method='first'))
#DF
#通过axis参数,设置每列独立的“排名”
frame = pd.DataFrame({'b': [4.3, 7, -3, 2],
'a': [0, 1, 0, 1],'c': [-2, 5, 8, -2.5]})
frame=frame.sort_index(axis=1)
print(frame.rank(axis='columns',method='first'))#此处method没用。。。