Pandas Tips: 关于列(名)的各种妖娆 *** 作

Pandas Tips: 关于列(名)的各种妖娆 *** 作,第1张

Pandas Tips: 关于列(名)的各种妖娆 *** 作

目录

0. 前言

1. 缺省设置下从文件读入

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

paramstestcase1testcase2testcase3testcase4fband_idx0000cn_start0000cn_stop3333cn_step0.50.50.50.5num_frame2000200020002000

(2) param_without_header.csv

fband_idx0000cn_start0000cn_stop3333cn_step0.50.50.50.5num_frame2000200020002000 1. 缺省设置下从文件中读入

        用read_csv()或者read_table()从数据文件中读入数据时,header的缺省值为'infer',表示pandas会自动从第一行中提取column names。

df=pd.read_csv('param.csv',index_col=False)
df
paramstestcase1testcase2testcase3testcase40fband_idx0.00.00.00.01cn_start0.00.00.00.02cn_stop3.03.03.03.03cn_step0.50.50.50.54num_frame2000.02000.02000.02000.0

        注意,由于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
paramscase1case2case3case40paramstestcase1testcase2testcase3testcase41fband_idx00002cn_start00003cn_stop33334cn_step0.50.50.50.55num_frame2000200020002000 2.2 没有header的文件

        对于原本就没有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
case4

5. 读入文件后修改列名 

        除了在读入文件时直接设置自己想要的列名外,也可以在读入文件以后再进行修改。有以下两种方法可以考虑:

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: object
7. 直接初始化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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5571730.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存