使用正则表达式在Python中重命名列

时间:2018-04-20 18:54:15

标签: python

我有一个数据集,其中包含在给定月份内销售的单位数量的列 - 问题是每月单位列以MM / yyyy格式命名,这意味着每个记录有12列单位信息。< / p>

例如,我的数据如下:

ProductID  |  CustomerID  |  04/2018  |  03/2018  |  02/2018  |  FileDate  |
a1032      |  c1576       |     36    |     12    |     19    | 04/20/2018 |

导致此问题的原因是每个月都有一个新文件,文件名相同,但基于过去12个月的单位信息的列标题不同。

我想要做的是,将月度单位列重命名为Month1,Month2,Month3 ......基于将导致输出的简单正则表达式,例如([0-9]*)/([0-9]*)

ProductID  |  CustomerID  |   Month1  |   Month2  |   Month3  |  FileDate  |
a1032      |  c1576       |     36    |     12    |     19    | 04/20/2018 |

我知道这应该可以使用Python,但因为我以前从未使用过Python(我是一个老的.Net开发人员)我真的不知道如何实现这个目标。

我已经对Python中的列重命名做了一些研究,但没有一个提到模式匹配来重命名列,例如:

 df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})

更新:我在我的示例中显示的数据只是列的一部分;总数,在我的数据集中我有120列,其中只有12列需要重命名,这就是为什么我认为正则表达式可能是最简单的方法。

3 个答案:

答案 0 :(得分:1)

如果您要转换为某些设置名称,则可以更轻松地将新列表传递给df.columns属性

df.columns = ['ProductID','CustomerID']+['Month{}'.format(i) for i in range(12)]+['FileDate']

如果您想使用重命名,如果您可以编写一个功能find_new_name来执行您想要的单个名称转换,则可以使用

重命名整个列表old_names
df.rename(columns = {oldname:find_new_name(old_name) for old_name in old_names})

或者,如果你有一个带有新名称的函数并找出旧名称对应的函数,那么它将是

df.rename(columns = {find_old_name(new_name):new_name for new_name in new_names})

您也可以

for new_name in new_names:
    old_name = find_new_name(old_name)
    df[new_name] = df[old_name]

这会将数据复制到具有新名称的新列而不是重命名,因此您可以将子集仅限于所需的列。

答案 1 :(得分:1)

import re

# regex pattern
pattern = re.compile("([0-9]*)/([0-9]*)")

# get headers as list
headers = list(df)

# apply regex
months = 1
for index, header in enumerate(headers):
    if pattern.match(header):
        headers[index] = 'Month{}'.format(months)
        months += 1

# set new list as column headers
df.columns = headers

答案 2 :(得分:1)

由于rename可以将函数作为映射器,我们可以定义一个自定义函数,如果旧列名与正则表达式匹配,则以新格式返回新列名;否则,返回相同的列名。例如,

import re


def mapper(old_name):
    match = re.match(r'([0-9]*)/([0-9]*)', old_name)
    if match:
        return 'Month{}'.format(int(match.group(1)))
    return old_name

df = df.rename(columns=mapper)