pandas笔记(5)
在Python中,dataframe可以使用默认行列索引,也可以自行设置索引。
查看索引
新建一个DataFrame
import pandas as pddf = pd.DataFrame ([['a','A'],['b','B'],['c','C']],index=[1,2,3],columns=['小写','大写'])df# 返回小写大写1aA2bB3cC
- 获取列索引
# 获取列索引df.columns # 返回Index(['小写', '大写'], dtype='object')
- 获取行索引
# 获取行索引df.index# 返回Int64Index([1, 2, 3], dtype='int64')
行、列索引的修改
对于DataFrame,如果需要对索引进行修改,可以通过 index 和 columns 参数来进行操作,也可以通过 rename() 方式实现。
- 修改行索引:index
# 将行索引改变为一二三df.index = list("一二三")df# 返回小写大写一aA二bB三cC
- 修改列索引:columns
# 将列索引改为l,udf.columns = list('lu')df# 返回lu一aA二bB三cC
- rename()方法
格式:df.rename(索引参数={},inplace = False/True)
其中inplace参数为False时,不修改原数据,为True时,会对原数据修改。默认False
示例:将 df 的行索引变为123,列索引变为“小写”,“大写”,并将修改结果返回给 df
df.rename(index = {"一":1,"二":2,"三":3},columns = {"l":"小写","u":"大写"},inplace = True)df# 返回小写大写1aA2bB3cC
将数据列设置为索引列
- 将列转化为索引
在创建好一个DataFrame后,可以通过 set_index() 方法将其中的一列或多列设置为索引列。
格式:df.set_index(keys, drop, append, inplace)
参数:
keys:设置为索引的列名称
drop:是否删除被设为索引的列,默认True(删除)。
append:是否将新索引列附加到旧索引列上,默认False(不附加)
inplace:是否修改原数据,默认False(不修改)
'''创建一个df,并按照A列排序'''import pandas as pdimport numpy as npdf = pd.DataFrame(np.arange(16).reshape((4,4)),index = list('abcd'),columns=['A','B','C','D'])df['rank']=df['A'].rank(method='first')df# 返回ABCDranka01231.0b45672.0c8910113.0d121314154.0'''将rank设为新的索引'''df.set_index('rank')# 返回ABCDrank1.001232.045673.08910114.012131415'''设置多层次索引'''df.set_index(['A','B'])# 返回CDrankAB01231.045672.08910113.0121314154.0'''对比drop参数'''df.set_index('rank',drop=False)# 返回ABCDrankrank1.001231.02.045672.03.08910113.04.0121314154.0'''对比append参数'''df.set_index('rank',append=True)# 返回ABCDranka1.00123b2.04567c3.0891011d4.012131415
- 将索引转化为列
reset_index()方法可以将索引重新转化为列
格式:reset_index(level, drop, inplace)
参数:
level:用于指定要将层次化索引的第几层转化为columns,第一个索引为0级,第二个为1级,默认为None(全部索引)。
drop:是否删除索引列,默认False。
inplace:是否修改原数据,默认False(不修改)
# 创建一个df_resetdf_set = df.set_index(["A","B"])df_set# 返回CDrankAB01231.045672.08910113.0121314154.0# 将A、B索隐列重新转化为列df_reset = df_set.reset_index(['A','B'])df_reset# 返回ABCDrank001231.0145672.028910113.03121314154.0
索引切片
DataFrame可以对行,列通过索引进行切片处理。
注意:在pandas、numpy中,切片的结果是产生一个视图,对切片数据进行修改后,会影响到原始数据。(但在list 中进行切片产生的是copy副本)
# 新建一个DataFrameimport pandas as pdimport numpy as npdf1 = pd.DataFrame(np.arange(16).reshape((4,4)),index = [1,2,3,4],columns=['A','B','C','D'])df1# 返回ABCD10123245673891011412131415
- 选取单列
传入需要提取的列名
df1["A"]# 返回1 02 43 84 12Name: A, dtype: int32
- 选取多列
将需要的列名,以列表的形式传入
df1[["A",'B']]# 返回AB10124538941213
- 选取单行
传入所需行号
df1[2:3]# 返回 ABCD3891011
- 选取多行
和选取单行方法一样(强迫症0.0)
df1[:3]# 返回 ABCD10123245673891011
- 按条件选取行
df1[df1["A"]>5]# 返回ABCD3891011412131415
- 切片产生的是个视图,修改切片会影响原始数据
(下面有两个需要注意的地方)
# 对 df1 的A列进行切片,并赋值给 t ,此时 t 是 df1 的一个视图,对 t 修改,会另 df1 产生变化。import pandas as pdimport numpy as npdf1 = pd.DataFrame(np.arange(16).reshape((4,4)),index = [1,2,3,4],columns=['A','B','C','D'])print(df1)t = df1["A"]t[1] = 100 # 注意: 由于已经设置了索引,这里就是t[1],而不是t[0]df1# 返回 A B C D1 0 1 2 32 4 5 6 73 8 9 10 114 12 13 14 15ABCD1100123245673891011412131415# 需要注意的是,如果想要对 t 整体修改,需要以 t 的切片来完成# 注意: 如果写成 t = [0,0,0,0]则是对 t 重新进行了赋值t[:] = [0,0,0,0]print(df1) A B C D1 0 1 2 32 0 5 6 73 0 9 10 114 0 13 14 15
增加行列
可以通过列表等方式为新增行、列提供数据,但需要保证长度与dataframe一致。也可以通过series索引来精确赋值。
- 增加行
df.loc['e']=[16,17,18,19]df# 返回 ABCDa0123b4567c891011d12131415e16171819
- 增加列
df.loc[:,'E']=[10,20,30,40,50]df# 返回 ABCDEa012310b456720c89101130d1213141540e1617181950
- 用series精确赋值
''' 通过series进行赋值,当series缺少E列时,默认为nan'''a=pd.Series([10,20,30,40],index=['A','B','C','D'])df5.loc['f']=adf5# 返回 ABCDEa0.0 1.0 2.03.010.0b4.05.06.07.020.0c8.09.010.011.030.0d12.013.014.015.040.0e16.017.018.019.050.0f10.020.030.040.0NaN
横竖表转换
横表变竖表
通过stack()或melt() 函数,可以将 df 结构的表转化为树形表。stack()是通过保证行索引不变,然后将所有列索引转化为行索引。
melt()则是通过参数指明保持不变的列,再进行转化。
melt()格式:melt(id_vars=[], var_name =[] , value_name)
参数:
id_vars:用于指明保持不变的列
var_name:用于表示转化之后新增列的列名
value_name:用于表示新索引对应值的名
stack() 示例:
import pandas as pdtree = pd.DataFrame({"A":[1,4],"B":[2,5],"C":[3,6]})tree# 返回ABC01231456'''使用stack() 进行转化'''tree.stack()# 返回0 A 1 B 2 C 31 A 4 B 5 C 6dtype: int64
melt() 示例:
import pandas as pdstudent = pd.DataFrame({"school":["五十七","十四中","二中"],"grade1":[623,466,285],'grade2':[668,485,226],'grade3':[621,429,281]})student# 返回schoolgrade1grade2grade30五十七6236686211十四中4664854292二中285226281student.melt(id_vars="school",value_name="number",var_name="grade")# 返回schoolgradenumber0五十七grade16231十四中grade14662二中grade12853五十七grade26684十四中grade24855二中grade22266五十七grade36217十四中grade34298二中grade3281
- 竖表变横表
通过unstack()或pivot_table() 函数,可以将树形表转化为 df 结构的表
'''unstack()的作用于stack()相反'''tree.stack().unstack()# 返回ABC01231456'''pivot_table()函数的作用类似于数据透视表的作用'''student1.pivot_table(index="school",columns="grade",values= "number")# 返回gradegrade1grade2grade3school二中285226281五十七623668621十四中466485429
赞 (0)