目录
0. 前言
2. 读入文件时自己对列进行命名
2.1 有header的文件
2.2 没有header的文件
3. 获取列名
4. 列名的列表以及列遍历 *** 作
5. 读入文件后修改列名
5.1 暴力方法
5.2 使用rename方法
6. 使用列名访问数据列
7. 直接初始化Dataframe
0. 前言
本文基于代码示例的方式介绍关于pandas dataframe的列和列名(column names)的各种常(妖)规(娆) *** 作。
以下代码在Jupyter Notebook中运行测试过。在Jupyter Notebook中,每个cell最后一行的运行结果会作为当前cell的结果打印出来,不需要显示地调用print(),有的示例代码中利用了这一特性。如果是在其它环境运行的话,则需要显式地调用print()。
另外,假定已经导入pandas如下所示:
import pandas as pd
各示例代码的下面紧跟的是对应的Jupyter Notebook中对应cell的运行输出。
本文中用到的两个数据文件例为:
(1) param.csv
(2) param_without_header.csv
用read_csv()或者read_table()从数据文件中读入数据时,header的缺省值为'infer',表示pandas会自动从第一行中提取column names。
df=pd.read_csv('param.csv',index_col=False) df
注意,由于index_col指定为False了,所以pandas自动添加了数字表示的行号。
2. 读入文件时自己对列进行命名 2.1 有header的文件对于原本有header的文件,如果想要用自己命名的column names的话,可以通过names参数进行指定,但是此时需要将header设置为0. 意思是告诉pandas用names指定的名字列表替代row#0中的名字列表。
df=pd.read_csv('param.csv',index_col=False, header=0, names=['params','case1','case2','case3','case4']) df.columns
Index(['params', 'case1', 'case2', 'case3', 'case4'], dtype='object')
如果没有指定header=0,而又另行指定names参数的话,pandas会自动认为原文件没有用于指定column names的行,因此会将row#0也一并读入,再本例中这显然不是你想要的行为,如以下例所示。所以,当用names另行指定column names时,需要主要原文件是否有用于指定column names的行,由此决定是否需要设置header=0
df=pd.read_csv('param.csv',index_col=False, names=['params','case1','case2','case3','case4']) df.columns
对于原本就没有header的文件,如果不指定的话,pandas会自动指定整数列号。此时用names指定列名的话,不需要设置header,当然设置header=None也是一样的效果
df = pd.read_csv("param_without_header.csv", header=None) print(df.columns) df = pd.read_csv("param_without_header.csv",names=["params", "case1", "case2", "case3", "case4"]) # header=None is not needed. df.columns
Int64Index([0, 1, 2, 3, 4], dtype='int64')
Index(['params', 'case1', 'case2', 'case3', 'case4'], dtype='object')3. 获取列名
可以用Dataframe.columns属性来获取列名列表。注意,columns是一个属性,而不是方法,因此使用时不需要带括号()
print(type(df.columns)) # columns是什么类型? print(df.columns[0]) # 虽然columns不是list,但是可以像list一样进行indexing *** 作 df.columns
params Index(['params', 'case1', 'case2', 'case3', 'case4'], dtype='object')
将columns转换为列表,有以下两种方法可以考虑:
print(list(df.columns)) # 将columns转换为python list print(type(df.columns.tolist())) # 将columns转换为python list print(df.columns.tolist()) # 将columns转换为python list
['params', 'case1', 'case2', 'case3', 'case4']['params', 'case1', 'case2', 'case3', 'case4']
甚至直接用list(df)就可以得到df的column names列表!
list(df)
['params', 'case1', 'case2', 'case3', 'case4']4. 列名的列表以及列遍历 *** 作
以下几种方式都可以。前两者在python中被称之为list comprehension.
print([col for col in df]) print([col for col in df.columns]) #for col in df: for col in df.columns: print(col)
['params', 'case1', 'case2', 'case3', 'case4'] ['params', 'case1', 'case2', 'case3', 'case4'] params case1 case2 case3 case45. 读入文件后修改列名
除了在读入文件时直接设置自己想要的列名外,也可以在读入文件以后再进行修改。有以下两种方法可以考虑:
5.1 暴力方法直接对columns进行重新赋值。
但是使用该方法有一个缺点,就是必须把所有的列名都写上,否则程序异常。
df=pd.read_csv('param.csv',index_col=False) print(df.columns) df.columns = ['params','case1','case2','case3','case4'] print(df.columns)
Index(['params', 'testcase1', 'testcase2', 'testcase3', 'testcase4'], dtype='object') Index(['params', 'case1', 'case2', 'case3', 'case4'], dtype='object')5.2 使用rename方法
df=pd.read_csv('param.csv',index_col=False) print(df.columns) df.rename(columns={'testcase1':'case1', 'testcase2':'case2'}, inplace = True) #inplace的意思是在原Dataframe上完成 print(df.columns)
Index(['params', 'testcase1', 'testcase2', 'testcase3', 'testcase4'], dtype='object') Index(['params', 'case1', 'case2', 'testcase3', 'testcase4'], dtype='object')6. 使用列名访问数据列
df=pd.read_csv('param.csv',index_col=False) # df[('params')] does the same thing df['params']
0 fband_idx 1 cn_start 2 cn_stop 3 cn_step 4 num_frame Name: params, dtype: object
对于没有header的文件,读入时也没有指定column names,则会指定整数列号,此时可以整数列好进行列访问。注意:此时不需要双引号或单引号“”。
df=pd.read_csv('param_without_header.csv',index_col=False, header=None) print(df.columns) df[0]
Int64Index([0, 1, 2, 3, 4], dtype='int64') 0 fband_idx 1 cn_start 2 cn_stop 3 cn_step 4 num_frame Name: 0, dtype: object7. 直接初始化Dataframe
上面都是以从数据文件(csv或txt)中读取数据为例(这应该是最主流的用法吧),但是也可以利用数据直接进行Dataframe初始化,在初始化中,以{column name : data column}的字典键值的方式指定内容,如下例所示:
df1=pd.Dataframe({'params':['fband_idx','cn_start','cn_stop'],'case1':[1,5,6],'case2':[1,3,4]}) print(df1)
params case1 case2 0 fband_idx 1 1 1 cn_start 5 3 2 cn_stop 6 4
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)