使用pandas DataFrame.rename()函数重命名列

时间:2020-02-23 14:40:13  来源:igfitidea点击:

Pandas是用于数据分析的开源Python库。
它使Python能够处理类似电子表格的数据,以实现快速数据加载,操作,对齐和合并以及其他功能。

为了给Python提供这些增强的功能,Pandas向Python引入了两种新的数据类型:

  • Series:代表DataFrame的单列

  • DataFrame:代表整个电子表格或者矩形数据

Pandas DataFrame也可以看作是Series对象的字典或者集合。

安装Python pandas模块

默认情况下,Linux环境中可能未安装panda模块

ModuleNotFoundError: No module named 'pandas'

因此,我们必须首先安装此模块。
由于我正在使用RHEL 8,因此我将使用dnf

# dnf -y install python3-pandas.x86_64

提示:在RHEL 8环境中,我在安装python3-panda时没有得到python3-matplotlib-3.0.3-3.el8.x86_64错误所需的libqhull.so.7()(64bit)
为了克服这个问题,我们需要使用subscription-manager repos --enable" codeready-builder-for-rhel-8- {ARCH} -rpms"来启用codeready-builderRepo。
其中将" {ARCH}"替换为体系结构值

加载数据集

  • 给定数据集后,我们首先加载它,然后开始查看其结构和内容。
    查看数据集的最简单方法是检查特定的行和列并对其进行子集化

  • 由于Pandas不属于Python标准库,因此我们必须首先告诉Python加载(导入)该库。

  • 使用熊猫函数时,通常的做法是给熊猫起别名pd

import pandas as pd
  • 加载库后,我们可以使用read_csv函数加载CSV数据文件。
    要从Pandas访问read_csv函数,我们使用点表示法。

  • 我已经为本教程创建了一个示例csv文件(cars.csv)(用逗号分隔),默认情况下," read_csv"函数将读取一个用逗号分隔的文件:

#!/usr/bin/env python3
import pandas as pd
# Pass the filename to the dataset to read_csv
# and assign the resulting DataFrame to variable 
df = pd.read_csv('/root/cars.csv')
# Print the content of cars.csv
print(df)

该脚本的输出:

# python3 /tmp/dataframe_ex.py
    Company       Car Country       State   Owner
0  Mahindra    XUV300   India   Karnataka  hynman
1      Tata     Nexon   India  Tamil Nadu    Amit
2   Hyundai     Creta   India   New Delhi   Rahul
3    Maruti    Brezza   India       Bihar  Saahil
4      Ford  Ecosport   India      Kerela    Anup

pandas.DataFrame.rename

  • 重命名DataFrame方法接受将旧值映射到新值的字典。

  • 我们可以使用此函数来重命名Python DataFrame中的单列或者多列

  • rename()方法提供一个名为inplace的参数,默认情况下为False并复制基础数据。

  • 我们可以通过inplace = True来重命名数据。

语法:

DataFrame.rename(self, mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None, errors='ignore')

除非另有说明,否则语法中提供的值为默认值。
这将返回带有重命名的轴标签的DataFrame。

"参数:""映射器:类似字典或者函数"类似字典或者函数转换以应用于该轴"值。
使用映射器和轴来指定要使用映射器或者索引和列定位的轴。

index:类似dict或者function替代指定轴(映射器,axis = 0等效于index = mapper)。

列:类似dict或者函数替代指定轴(映射器,轴= 1等效于列=映射器)。

axis:int或者str用映射器定位的轴。
可以是轴名称("索引","列")或者数字(0、1)。
默认值为"索引"。

copy:bool,默认为True还复制基础数据。

inplace:bool,默认为False是否返回新的DataFrame。
如果为True,则将忽略副本的值。

level:int或者级别名称,默认值为None如果是MultiIndex,则仅重命名指定级别中的标签。

错误:{'ignore','raise'},默认为'ignore'

方法1:使用列标签

重命名单列

替换同一文件中的单列的语法为:

pandas.DataFrame.rename(columns = {'<old_value>':'<new_value>'}, inplace = True/False)

在此示例中,我们将列名" Company"重命名为" Brand"

#!/usr/bin/env python3
import pandas as pd
# Pass the filename to the dataset to read_csv
# and assign the resulting DataFrame to variable
df = pd.read_csv('/root/cars.csv')
# Rename Single Column
df.rename(columns = {'Company':'Brand'}, inplace = True)
# print the output
print(df)

执行脚本,我们可以检查我们的列就位重命名是否成功:

# python3 /tmp/dataframe_ex.py
      Brand       Car Country       State   Owner
0  Mahindra    XUV300   India   Karnataka  hynman
1      Tata     Nexon   India  Tamil Nadu    Amit
2   Hyundai     Creta   India   New Delhi   Rahul
3    Maruti    Brezza   India       Bihar  Saahil
4      Ford  Ecosport   India      Kerela    Anup

重命名多列

要就地重命名多列,我们将使用以下语法:

pandas.DataFrame.rename(columns = {'<old_value_1>':'<new_value_1>', '<old_value_2>':'<new_value_2>'}, inplace = True/False)

我们只需要在花括号内添加<old_value>:<new_value>部分,以在多个位置替换列,在此示例中,我们将列名称Company替换为Brand,将Car替换为SUV:

#!/usr/bin/env python3
import pandas as pd
# Pass the filename to the dataset to read_csv
# and assign the resulting DataFrame to variable
df = pd.read_csv('/root/cars.csv')
# Rename Multiple Columns
df.rename(columns = {'Company':'Brand', 'Car':'SUV'}, inplace = True)
# print the output
print(df)

该脚本的输出确认替换成功:

# python3 /tmp/dataframe_ex.py
      Brand       SUV Country       State   Owner
0  Mahindra    XUV300   India   Karnataka  hynman
1      Tata     Nexon   India  Tamil Nadu    Amit
2   Hyundai     Creta   India   New Delhi   Rahul
3    Maruti    Brezza   India       Bihar  Saahil
4      Ford  Ecosport   India      Kerela    Anup

方法2:使用轴样式

DataFrame.rename()还支持"轴样式"调用约定,在该约定中,我们指定单个映射器和要应用该映射的轴。

使用此方法的"语法"为:

pandas.DataFrame.rename({'<old_value_1>':'<new_value_1>', '<old_value_2>':'<new_value_2>'}, axis='columns', inplace = True/False)

在这个示例python脚本中,我将把""中的两个列值替换为"品牌",将"汽车"替换为" SUV"。

#!/usr/bin/env python3
import pandas as pd
# Pass the filename to the dataset to read_csv
# and assign the resulting DataFrame to variable
df = pd.read_csv('/root/cars.csv')
# Rename Multiple Columns
df.rename({'Company': 'Brand', 'Car':'SUV'}, axis='columns',  inplace = True)
# print the output
print(df)

该脚本的输出:

# python3 /tmp/dataframe_ex.py
      Brand       SUV Country       State   Owner
0  Mahindra    XUV300   India   Karnataka  hynman
1      Tata     Nexon   India  Tamil Nadu    Amit
2   Hyundai     Creta   India   New Delhi   Rahul
3    Maruti    Brezza   India       Bihar  Saahil
4      Ford  Ecosport   India      Kerela    Anup

一些更多的例子:

在此示例中,我们将使用带有rename()函数的str.upper将所有标头更改为大写字符

#!/usr/bin/env python3
import pandas as pd
# Pass the filename to the dataset to read_csv
# and assign the resulting DataFrame to variable
df = pd.read_csv('/root/cars.csv')
# Rename Multiple Columns
df.rename(str.upper, axis='columns', inplace = True)
# print the output
print(df)

该脚本的输出:

# python3 /tmp/dataframe_ex.py
    COMPANY       CAR COUNTRY       STATE   OWNER
0  Mahindra    XUV300   India   Karnataka  hynman
1      Tata     Nexon   India  Tamil Nadu    Amit
2   Hyundai     Creta   India   New Delhi   Rahul
3    Maruti    Brezza   India       Bihar  Saahil
4      Ford  Ecosport   India      Kerela    Anup

同样,我们可以使用" str.lower"将"列标题格式"转换为小写形式。

使用具有名称的read_csv重命名列

read_csv函数中的names参数用于定义列名。
如果我们在此列表中传递额外的名称,它将使用该名称添加具有新值的另一个新列。
使用" header = 0"从输出中删除第一个标题

在这个例子中,我们定义了一个新列表" new_colums"并存储了新的列名。
确保新列表的长度与输入CSV或者列表中现有列表的长度相同

#!/usr/bin/env python3
import pandas as pd
# Define new list with the new column names
# The length of the new list must be same as existing column length
new_columns = ['Brand', 'SUV', 'Country', 'State', 'Owner']
# Pass the filename to the dataset to read_csv
# and assign the resulting DataFrame to variable
df = pd.read_csv('/root/cars.csv', names = new_columns, header = 0 )
# print the output
print(df)

该脚本的输出:

# python3 /tmp/dataframe_ex.py
      Brand       SUV Country       State   Owner
0  Mahindra    XUV300   India   Karnataka  hynman
1      Tata     Nexon   India  Tamil Nadu    Amit
2   Hyundai     Creta   India   New Delhi   Rahul
3    Maruti    Brezza   India       Bihar  Saahil
4      Ford  Ecosport   India      Kerela    Anup

使用tolist()重新分配列属性

  • tolist()用于将系列转换为列表。

  • 可以将列属性直接重新分配给Python列表。

  • 当列表具有与行和列标签相同数量的元素时,此分配有效。

  • 以下代码在每个Column对象上使用tolist方法来创建Python标签列表。

  • 然后,它修改列表中的几个值,并将列表重新分配给columns属性:

#!/usr/bin/env python3
import pandas as pd
# Pass the filename to the dataset to read_csv
# and assign the resulting DataFrame to variable
df = pd.read_csv('/root/cars.csv')
# Store the column header and converts to list
columns = df.columns
column_list = columns.tolist()
# Rename column labels with list assignments
column_list[0] = 'Brand'
column_list[1] = 'SUV'
# Reassign the new column values
df.columns = column_list
# print the output
print(df)

该脚本的输出:

# python3 /tmp/dataframe_ex.py
      Brand       SUV Country       State   Owner
0  Mahindra    XUV300   India   Karnataka  hynman
1      Tata     Nexon   India  Tamil Nadu    Amit
2   Hyundai     Creta   India   New Delhi   Rahul
3    Maruti    Brezza   India       Bihar  Saahil
4      Ford  Ecosport   India      Kerela    Anup

使用Panda DataFrame定义新的列列表

我不会将其称为重命名,而是可以定义一个新的列列表,并使用dataframe对象的columns属性替换现有的列列表。
但是,请确保新列列表的长度与我们要替换的列的长度相同。
这类似于我们在方法3中使用带有名称属性的read_csv所做的操作

#!/usr/bin/env python3
import pandas as pd
# Pass the filename to the dataset to read_csv
# and assign the resulting DataFrame to variable
df = pd.read_csv('/root/cars.csv')
# Print the BEFORE content
print(df.columns)
# Rename the Column List
df.columns = ['Brand', 'SUV', 'Country', 'State', 'Owner']
# Print the AFTER content
print(df.columns)

该脚本的输出:

# python3 /tmp/dataframe_ex.py
Index(['Company', 'Car', 'Country', 'State', 'Owner'], dtype='object')
Index(['Brand', 'SUV', 'Country', 'State', 'Owner'], dtype='object')