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

时间:2018-05-29 14:34:06

标签: python pandas multiple-columns rename

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

我希望将一个不同的潜在列名列表与一个关键字相关联,然后我可以将其用于以后的组信息。这与Renaming columns in pandas中的问题不同,因为这并未涉及可以与一个关键字关联的多个列名的使用。

例如:猫,狗,鸟,鱼 - >被替换为标题“animals”

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

这是否可以在熊猫中做到?

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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 :(得分:1)

这对你有用吗?

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