【问题标题】:rename multiple columns in pandas by keyword [duplicate]通过关键字重命名熊猫中的多列[重复]
【发布时间】:2018-11-08 06:23:45
【问题描述】:

我需要重命名 pandas 中的列,以便与预定义关键字关联的多个不同列名的标题被该关键字替换。

我希望将几个不同的潜在列名的列表与一个关键字相关联,然后我可以将其用于以后对信息进行分组。这不是Renaming columns in pandas 中的这个问题,因为它没有解决可以与一个关键字关联的多个列名的使用。

例如:猫、狗、鸟、鱼 -> 替换为标题“动物”

我正在查看重命名函数 HEREHERE ,但是,它似乎没有考虑将多个列与要重命名的关键字相关联的可能性。

这可以在 pandas 中实现吗?

到目前为止我的(不工作)尝试如下:

newNames = {
    'animals':['cats','dogs','fish'],
    'colors':['red','blue','green']
}

样本df:

cats    dogs    fish    red
1   2   3   2
2   3   5   4
3   4   3   4

df.rename(index=str,columns=newNames,inplace=True)

想要的结果

animals     animals     animals     colors
1   2   3   2
2   3   5   4
3   4   3   4

【问题讨论】:

  • 重复列通常是一个非常糟糕的主意。它可能会使您的结果无法使用。你确定这是你想要的吗?
  • 它不是重复的@DenisRasulev,因为该问题没有解决我面临的问题。
  • @jpp 是的,因为我稍后想对标题中的信息进行分组
  • @jpp 因为这是一个示例数据,所以我将处理数千个不同的 csv,我想规范化列名。
  • 当然,pandas 也可以处理数千个数据帧。像这样将列命名相同,几乎可以肯定不是解决问题的最佳方法。

标签: python pandas multiple-columns rename


【解决方案1】:

IIUC,您可以 - 作为对许多列使用 相同 名称的替代方法(这可能是个坏主意) - 考虑使用 MultiIndexing

例如:

categories = {"animals": ["cats", "dogs", "fish"],
              "colors" : ["red"]}

df.columns = pd.MultiIndex.from_tuples([(k, sub) for k,v in categories.items() for sub in v])

那么你的输出会是这样的:

        animals                 colors

        cats    dogs    fish    red
0       1       2       3       2
1       2       3       5       4
2       3       4       3       4

【讨论】:

    【解决方案2】:

    使用melt创建您的字典

    df.rename(columns=pd.DataFrame(newNames).melt().set_index('value').variable.to_dict())
    Out[275]: 
       animals  animals  animals  colors
    0        1        2        3       2
    1        2        3        5       4
    2        3        4        3       4
    

    【讨论】:

      【解决方案3】:

      这对你有用吗?

      import pandas as pd
      df = pd.DataFrame({"cats": [1, 2, 3], "dogs": [4, 5, 6], "fish": [7, 8, 9], "red": [10, 11, 12],})
      
      # df
         cats  dogs  fish  red
      0     1     4     7   10
      1     2     5     8   11
      2     3     6     9   12
      
      new_names = {
          "cats": "animals",
          "dogs": "animals",
          "fish": "animals",
          "red": "colors"
          }
      
      new_df = df.rename(index=str, columns=new_names)
      
      # new_df
         animals  animals  animals  colors
      0        1        4        7      10
      1        2        5        8      11
      2        3        6        9      12
      

      如果new_names 字典中未列出列名,则它保持不变。在这种情况下,数据框的维度无关紧要。

      例子:

      df2 = pd.DataFrame({"cats": [1, 2, 3], "digs": [4, 5, 6], "fish": [7, 8, 9], "worm": [10, 11, 12], "blue": [10, 11, 12]})
      
      # df2
         cats  digs  fish  worm  blue
      0     1     4     7    10    10
      1     2     5     8    11    11
      2     3     6     9    12    12
      
      new_df2 = df2.rename(index=str, columns=new_names)
      
      # new_df2
         animals  digs  animals  worm  blue
      0        1     4        7    10    10
      1        2     5        8    11    11
      2        3     6        9    12    12
      

      【讨论】:

      • 这确实有效,但要提到的一件事是,并非所有的 dfs 都包含相同的列。这意味着有些可能不必重命名为“颜色”,因为它们不包含任何与之相关的关键词。在这种情况下,由于数组形状,此解决方案会引发关键错误。有没有办法克服这个问题?
      • 嗯,这很奇怪。我刚刚尝试了具有不同名称的不同列数的各种数据框,它们存在于new_names 字典中而不是。没有收到任何错误。 new_names 字典中未列出的值保持不变。你能复制粘贴错误信息吗?
      • 当然:ValueError: arrays must be all the length
      • 这里肯定有问题。您没有使用数组与另一个数组。您只需根据字典替换列名。如果列名没有字典键,则它保持不变。在这种情况下,数组的长度无关紧要。
      猜你喜欢
      • 2019-05-25
      • 2020-05-03
      • 1970-01-01
      • 2021-08-15
      • 2022-11-21
      • 1970-01-01
      • 2019-10-21
      • 2020-09-04
      相关资源
      最近更新 更多