如何重命名匹配regex的数据框列



我正在尝试重命名匹配正则表达式的pandas数据框列,并保持其他列不变。我有多个数据框架,其中一些不包含与正则表达式匹配的列。例如:

#no matching columns
['Description', 'Image']
# 3 Matching columns
['Name (Ka)', 'Name (En)', Name('Ru'), 'Description', 'Image']

这是我的列表理解和语言字典。

languages = {
'ka' : 1,
'en' : 2,
'ru' : 3
}
#in case of non-matching dataframe this comprehensions raises "ValueError Length mismatch: Expected #axis has 2 elements, new values have 0 elements" because it returns empty list
df.columns = [m.group(1) + '_lang' + str(languages[m.group(2)]) for m in (re.match("^([a-zA-Z]+)s*(([a-zA-Z]+))$", col.strip().lower()) for col in df.columns) if m]

包含匹配列的数据框的期望结果:

['name_lang1', 'name_lang2', 'name_lang3', 'Description', 'Image']

有可能在一行中完成吗?由于事先

您可以使用:

import pandas as pd
import re
languages = {'ka': 1, 'en': 2, 'ru': 3}
pat = '|'.join(languages.keys())
lang = re.compile(f"(?P<prefix>[^(]+)((?P<lang>{pat}))", re.IGNORECASE)
df.columns = [f"{m['prefix'].lower().strip()}_lang{languages[m['lang'].lower()]}"
if (m := lang.search(col)) else col
for col in df.columns]

输出:

# Before
>>> df.columns.tolist()
['Name (Ka)', 'Name (En)', 'Name (Ru)', 'Description', 'Image']
# After
>>> df.columns.tolist()
['name_lang1', 'name_lang2', 'name_lang3', 'Description', 'Image']

最新更新