栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

paramstestcase1testcase2testcase3testcase4
fband_idx0000
cn_start0000
cn_stop3333
cn_step0.50.50.50.5
num_frame2000200020002000

(2) param_without_header.csv

fband_idx0000
cn_start0000
cn_stop3333
cn_step0.50.50.50.5
num_frame2000200020002000

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

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

df=pd.read_csv('param.csv',index_col=False)
df
paramstestcase1testcase2testcase3testcase4
0fband_idx0.00.00.00.0
1cn_start0.00.00.00.0
2cn_stop3.03.03.03.0
3cn_step0.50.50.50.5
4num_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
paramscase1case2case3case4
0paramstestcase1testcase2testcase3testcase4
1fband_idx0000
2cn_start0000
3cn_stop3333
4cn_step0.50.50.50.5
5num_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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/580511.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号