【问题标题】:Rename column names using dictionary and regular expression使用字典和正则表达式重命名列名
【发布时间】:2021-08-27 11:59:58
【问题描述】:

我有一个名为 mcmc_samples 的 DataFrame,其中包含多个变量的 Markov-Chain-Monte-Carlo 样本

deviance 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)

但这给了我以下错误:

TypeError: repl 必须是字符串或可调用的

【问题讨论】:

    标签: python regex pandas string rename


    【解决方案1】:

    假设字典包含全面的数据,并且您将匹配的所有数字在字典中都有相应的键,您可以使用

    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详情

    • (?&lt;=\[) - 就在前面,必须有一个 [ 字符
    • (\d+) - 第 1 组:一位或多位数字
    • , - 逗号
    • (\d+) - 第 2 组:一位或多位数字
    • (?=]) - 紧随其后,必须有一个 ] 字符。

    如果字典中不存在匹配的数字,则需要返回可以使用的数字

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-07
      • 2021-11-04
      • 2018-05-13
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 2020-01-19
      相关资源
      最近更新 更多