使用字典和正则表达式重命名列名
Rename column names using dictionary and regular expression
我有一个名为 mcmc_samples 的 DataFrame,其中包含多个变量的 Markov-Chain-Monte-Carlo 样本
偏差
K_1[1,1]
K_1[1,2]
K_1[1,3]
K_1[2,1]
K_1[2,2]
K_1[2,3]
0.2
0.4
0.6
0.1
0.3
0.9
0.8
...
...
...
...
...
...
...
列名称由级别 (K_1)、变量(逗号前括号中的第一个数字)和类别(逗号后括号中的第二个数字)组成。
我尝试重命名列名,使括号中的数字更有意义。为此,我想使用以下词典。
dict_var = {1: "variable_1", 2: "variable_2"}
dict_categ = {1: "item_1, 2: "item_2", 3: "item_3"}
我尝试使用正则表达式替换字符串
mcmc_samples.columns = mcmc_samples.columns.str.replace(r"(?<=,)(.*?)(?=\])",
mcmc_samples.columns.str.extract(r"(?<=,)(.*?)(?=\])")[0].map(dict_categ), regex=True)
但这给了我以下错误:
类型错误:repl 必须是字符串或可调用的
假设字典中包含全面的数据,并且您要匹配的所有数字在字典中都有对应的键,您可以使用
mcmc_samples.columns = mcmc_samples.columns.str.replace(
r"(?<=\[)(\d+),(\d+)(?=])",
lambda x: f"{dict_var[int(x.group(1))]},{dict_categ[int(x.group(2))]}",
regex=True)
见regex demo。 详情:
(?<=\[)
- 就在前面,必须有一个 [
char
(\d+)
- 第 1 组:一个或多个数字
,
- 逗号
(\d+)
- 第 2 组:一个或多个数字
(?=])
- 紧接着,必须有一个 ]
字符。
如果您需要 return 匹配的数字(如果字典中没有),您可以使用
def repl(x):
result = []
if int(x.group(1)) in dict_var:
result.append(dict_var[int(x.group(1))])
else:
result.append(x.group(1))
if int(x.group(2)) in dict_categ:
result.append(dict_categ[int(x.group(2))])
else:
result.append(x.group(2))
return ",".join(result)
mcmc_samples.columns = mcmc_samples.columns.str.replace(
r"(?<=\[)(\d+),(\d+)(?=])",
lambda x: repl(x),
regex=True)
我有一个名为 mcmc_samples 的 DataFrame,其中包含多个变量的 Markov-Chain-Monte-Carlo 样本
偏差 | K_1[1,1] | K_1[1,2] | K_1[1,3] | K_1[2,1] | K_1[2,2] | K_1[2,3] |
---|---|---|---|---|---|---|
0.2 | 0.4 | 0.6 | 0.1 | 0.3 | 0.9 | 0.8 |
... | ... | ... | ... | ... | ... | ... |
列名称由级别 (K_1)、变量(逗号前括号中的第一个数字)和类别(逗号后括号中的第二个数字)组成。
我尝试重命名列名,使括号中的数字更有意义。为此,我想使用以下词典。
dict_var = {1: "variable_1", 2: "variable_2"}
dict_categ = {1: "item_1, 2: "item_2", 3: "item_3"}
我尝试使用正则表达式替换字符串
mcmc_samples.columns = mcmc_samples.columns.str.replace(r"(?<=,)(.*?)(?=\])",
mcmc_samples.columns.str.extract(r"(?<=,)(.*?)(?=\])")[0].map(dict_categ), regex=True)
但这给了我以下错误:
类型错误:repl 必须是字符串或可调用的
假设字典中包含全面的数据,并且您要匹配的所有数字在字典中都有对应的键,您可以使用
mcmc_samples.columns = mcmc_samples.columns.str.replace(
r"(?<=\[)(\d+),(\d+)(?=])",
lambda x: f"{dict_var[int(x.group(1))]},{dict_categ[int(x.group(2))]}",
regex=True)
见regex demo。 详情:
(?<=\[)
- 就在前面,必须有一个[
char(\d+)
- 第 1 组:一个或多个数字,
- 逗号(\d+)
- 第 2 组:一个或多个数字(?=])
- 紧接着,必须有一个]
字符。
如果您需要 return 匹配的数字(如果字典中没有),您可以使用
def repl(x):
result = []
if int(x.group(1)) in dict_var:
result.append(dict_var[int(x.group(1))])
else:
result.append(x.group(1))
if int(x.group(2)) in dict_categ:
result.append(dict_categ[int(x.group(2))])
else:
result.append(x.group(2))
return ",".join(result)
mcmc_samples.columns = mcmc_samples.columns.str.replace(
r"(?<=\[)(\d+),(\d+)(?=])",
lambda x: repl(x),
regex=True)