Python 按关键字重命名pandas中的多个列

Python 按关键字重命名pandas中的多个列,python,pandas,multiple-columns,rename,Python,Pandas,Multiple Columns,Rename,我需要重命名pandas中的列,以便将与预定义关键字相关联的几个不同的列名的标题替换为该关键字 我希望将几个不同的潜在列名的列表与一个关键字相关联,然后我可以使用这些关键字对以后的信息进行分组。这与中的问题不同,因为这不能解决使用多个可与一个关键字关联的列名的问题 例如:猫、狗、鸟、鱼->被替换为标题“动物” 我正在研究rename函数,但是,它似乎没有考虑将多个列与要重命名的关键字关联的可能性 这能在熊猫体内实现吗 到目前为止,我的(不工作)尝试如下: newNames = { 'an

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

我希望将几个不同的潜在列名的列表与一个关键字相关联,然后我可以使用这些关键字对以后的信息进行分组。这与中的问题不同,因为这不能解决使用多个可与一个关键字关联的列名的问题

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

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

这能在熊猫体内实现吗

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

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

使用
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

使用
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

这对你有用吗

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\u names
dictionary中,那么它将保持不变。在这种情况下,数据帧的尺寸无关紧要

例如:

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

这对你有用吗

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\u names
dictionary中,那么它将保持不变。在这种情况下,数据帧的尺寸无关紧要

例如:

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

IIUC,您可以作为对多个列使用相同名称的替代方案(这可能是个坏主意)-考虑使用<代码>多索引< <代码> < /P> 例如:

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

IIUC,您可以作为对多个列使用相同名称的替代方案(这可能是个坏主意)-考虑使用<代码>多索引< <代码> < /P> 例如:

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


重复列通常是一个非常糟糕的主意。这可能会使您的结果无法使用。你确定这就是你想要的吗?这不是重复的@DenisRasulev,因为这个问题没有解决我面临的问题。@jpp是的,因为我以后想对来自headers@jpp因为这是一个示例数据,所以我将使用数千种不同的CSV,我希望规范化列名。当然,熊猫也可以处理数千个数据帧。像这样给列命名肯定不是解决问题的最佳方法。重复列通常是一个非常糟糕的主意。这可能会使您的结果无法使用。你确定这就是你想要的吗?这不是重复的@DenisRasulev,因为这个问题没有解决我面临的问题。@jpp是的,因为我以后想对来自headers@jpp因为这是一个示例数据,所以我将使用数千种不同的CSV,我希望规范化列名。当然,熊猫也可以处理数千个数据帧。像这样给列命名肯定不是解决问题的最佳方法。这确实有效,但需要指出的是,并非所有dfs都包含相同的列。这意味着一些可能不必重命名为“颜色”,因为它们不包含任何与此相关的关键字。在本例中,此解决方案由于数组形状而引发一个键错误。有办法克服cme吗?嗯,这很奇怪。我只是尝试了各种数据帧,它们的列数不同,名称也不同,存在于
new\u names
字典中,而不是。没有任何错误。未在
new\u names
字典中列出的值保持不变。您能复制粘贴错误消息吗?当然:ValueError:数组必须都是相同长度这里一定有问题。与其他阵列相比,您没有使用阵列。您只需根据字典替换列名。如果列名没有字典键,则它保持不变。在这种情况下,数组的长度无关紧要。这是可行的,但需要指出的是,并非所有dfs都包含相同的列。这意味着一些可能不必重命名为“颜色”,因为它们不包含任何与此相关的关键字。在本例中,此解决方案由于数组形状而引发一个键错误。有办法克服cme吗?嗯,这很奇怪。我只是尝试了各种数据帧,它们的列数不同,名称也不同,存在于
new\u names
字典中,而不是。没有任何错误。未在
new\u names
字典中列出的值保持不变。您能复制粘贴错误消息吗?当然:ValueError:数组必须都是相同长度这里一定有问题。与其他阵列相比,您没有使用阵列。您只需根据字典替换列名。如果列名没有字典键,则它保持不变。在这种情况下,数组的长度无关紧要。