Pandas: 对 DataFrame 的列名进行重命名


不得不说,Pandas 是我很喜欢的一个工具,之前在外贸公司做采购和物流相关方面事情的时候,跟 Excel 结下了不浅的关系。在处理 Excel 的数据过程中,依照对数据业务的理解也使得后来去理解 MySQL 相关的数据的关系模型有了一些清晰的思维过程。

如果说创业公司需要什么工具能支撑起业务快速发展和需求变化,Excel 是一个利器,这在很多行业的实际应用实践中都得到过检验,而我自己也自认为曾经利用它在很长一段时间里支撑起了一家公司的核心业务流程。

但凡是工具就有长短,Excel 虽是利器,可能在高手眼里表还未开,数据已经在脑海里飞过了千百次,即使是个小白也能对着那横竖格子拥有完整的操作能力,但是,任何事物到了一定量级,就性质变了,而更甚至涉及到多人、跨部门共享操作,就更难以完成有效的数据流通了。

所以有长有短,有些地方,还是需要有别的解决方案,比如搞个数据库,然后至于如何利用这个数据库,开发一个 ERP 也好,简单整个 web 数据界面也罢,那就看各自能力和想象力了。

额,又啰嗦了。

在 Python 的世界里面,使用 Pandas 来读取 Excel 数据并操作数据,是一种非常有效的工作方法。如果你有较大的数据量需要操作和计算,又或者有很多的固定步骤需要频繁处理,都可以使用 Pandas 来处理,它,简单说就是:工业级的数据处理工具。

今天提个小点:使用 Pandas 处理各种不同的列名称,对它们进行重命名。

在大多数时候,我们会有个数据处理流程,这个流程的开始负责接收一批数据,然后中间经过各种处理和计算,输出为我们需要的结果,这就是:输入 –> 处理与计算 –> 输出。

这很像一个函数的概念对吧,可以这样理解了。

不过在输入的时候,我们会考虑使用一种数据标准,仅当数据符合我们的需求的时候,我们才能对其进行正常的处理并得到正确的输出。而一旦数据不符合需要的标准了,就很难得到正确的结果了。

这时候就需要在进行输入时候的前面一个再加一步:预处理。

在预处理的时候,常见就有个列名称标准化,在 Excel 中我们可能不太方便在面对很多种表头,还能正常合并数据然后一次处理的,而如果要每种表头都单独处理,就又特别磨炼人性的价值观了。而如果是在 Pandas 里面,我们可以利用 pandas.DataFrame.rename 这个方法来对任意各种表头进行统一标准化,以实现数据标准化中的列名称标准化,也可以叫数据字段标准化。

写出代码大概会是下面这样子:

import pandas as pd
import numpy as np

# 维护好各种表头对应关系的标准化数据
columns_rename = {
    "packetid": "ProductID",
    "packet id": "ProductID",
    "packet-id": "ProductID",
    "packet_id": "ProductID",
    "stkid": "ProductID",
    "stk id": "ProductID",
    "stk-id": "ProductID",
    "stk_id": "ProductID",
    "stock": "ProductID",
    "stock#": "ProductID",
    "stock #": "ProductID",
    "stockno": "ProductID",
    "stock no": "ProductID",
    "stock-no": "ProductID",
    "stock_no": "ProductID",
    "place": "CountryCode",
    "地点": "CountryCode",
    "所在地": "CountryCode",
    "locationcode": "CountryCode",
    "location code": "CountryCode",
    "location-code": "CountryCode",
    "location_code": "CountryCode",
    "location": "CountryCode",
    "source": "CountryCode",
    "country": "CountryCode"
}

# 假如你有个叫 data.xlsx 的表格文件,把它读进来,读完就得到一个 DataFrame
# 它跟表格很类似,我一般简称为 df,然后就开始对它进行各种操作
df = pd.read_excel('data.xlsx')

# 先可以看一眼前几条数据,默认 5 条
print(df.head())

# 先把表头做下小写,以及去除多余空白字符
df.columns = df.columns.str.lower().strip()

# 然后对列进行重命名,如果有匹配上的列名称,就会帮你全部重命名了
df = df.rename(columns=columns_rename)

# 而后再做下一步操作
# ……

然后再贴个官方文档链接:pandas.DataFrame.rename

文档很直观,信息量也足够,具体怎么玩就看你的了。