这里的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
现在我想:
所以基本上,无论是否"磅/小时"或者" 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',我不知道如何将正则表达式版本合并到其中。
任何帮助表示赞赏!
答案 0 :(得分:0)
这应该有效:
df.columns = [re.sub('\(.+/(.+)\)', r'per \1', c) for c in df.columns]
此处df
为DataFrame,re
为regular 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']
模式captures中hour
到(.+)
的变化是一个任意字,而不仅仅是识别hour
。替换中从per hour
到per \1
的更改会将捕获的单词(模式中的第1组)放入,而不仅仅是hour
。 (r
表示字符串只是意味着\
按字面解释,而不是作为转义。)