如何使用其中的某些字词重命名列

时间:2017-07-20 19:54:29

标签: python pandas rename

这里的python中的Noob。如果我问愚蠢的问题(我希望我不是),请原谅我。

我有一个如下所示的数据框1:

Running rate ($/hour)        Eating rate (lb/hour)     Age
50                          20                         50 
30                          10                         40

和另一个看起来像这样的数据框2:

Running rate (km/hour)     Eating rate (kg/hour)      Age
5                          23                         50 
3                          18                         40

现在我想:

  1. 遍历所有数据帧(我已经实现了)
    1. 更换所有"(XX /小时)"每小时一次'
  2. 所以基本上,无论是否"磅/小时"或者" km / hour"或者" kg /小时",我希望它们每小时更改为"",所以这两个数据框应如下所示:

    dataframe 1期望的输出:

    Running rate per hour       Eating rate per hour       Age
    50                          20                         50 
    30                          10                         40
    

    dataframe 2所需的输出:

    Running rate per hour      Eating rate per hour       Age
    5                          23                         50 
    3                          18                         40
    

    我已查看了很多帖子,并尝试使用

    > df.rename(columns={'a':'b'})
    

    ,但此方法仅更改名为' a'命名' b',我不知道如何将正则表达式版本合并到其中。

    任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

这应该有效:

df.columns = [re.sub('\(.+/(.+)\)', r'per \1', c) for c in df.columns]

此处dfDataFramereregular expression module

更新:对所使用的regular expression进行澄清。

我实际上做了一个比这里需要的更一般的形式。 OP的最简单的正则表达式实际上是

[re.sub('\(.+/hour\)', 'per hour', c) for c in ['A (a/hour)', 'B (b/hour)', 'Age']]

我使用的正则表达式是允许一般分母。例如,更简单的正则表达式

[re.sub('\(.+/hour\)', 'per hour', c) for c in ['A (a/hour)', 'B (b/day)', 'Age']]

给出

['A per hour', 'B (b/day)', 'Age']

但更普遍的正则表达式

[re.sub('\(.+/(.+)\)', r'per \1', c) for c in ['A (a/hour)', 'B (b/day)', 'Age']]

给出

['A per hour', 'B per day', 'Age']

模式captureshour(.+)的变化是一个任意字,而不仅仅是识别hour。替换中从per hourper \1的更改会将捕获的单词(模式中的第1组)放入,而不仅仅是hour。 (r表示字符串只是意味着\按字面解释,而不是作为转义。)