我有一个数据集,其中包含在给定月份内销售的单位数量的列 - 问题是每月单位列以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列需要重命名,这就是为什么我认为正则表达式可能是最简单的方法。
答案 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)