【问题标题】:Python: Splitting a string at any uppercase letter (as part of a rename for a column name)Python:在任何大写字母处拆分字符串(作为列名重命名的一部分)
【发布时间】:2017-11-28 22:47:43
【问题描述】:

我想使用 rename 函数重命名 Pandas 数据框中的列,因此我想将名称(字符串)拆分为字符串中的大写字母。 例如,我的列名类似于“FooBar”或“SpamEggs”,其中一列称为“Monty-Python”。我的目标是列名,如“foo_bar”、“spam_eggs”和“monty_python”。

我知道

'-'.join(re.findall('[A-Z][a-z]*', 'FooBar'))

会给我 Foo-Bar

但这不能包含在我的 rename 函数中:

df.rename(columns=lambda x: x.strip().lower().replace("-", "_"), inplace=True)

(应该在 striplower 之间,但会返回语法错误)。

谁能帮我将sn-p 包含到rename 或帮我找到除findall 之外的其他解决方案吗?

【问题讨论】:

  • 您可能会发现创建一个包含重命名功能的函数def rename(name) 比尝试将其全部塞进一个 lambda 更容易。然后你可以做df.rename(columns=rename, inplace=True)。这将使转换更简单,并使您的代码更具可读性。

标签: python regex pandas dataframe


【解决方案1】:
  1. 删除任何不是字母的内容
  2. 不在字符串开头的大写字母前添加下划线 (_)
  3. 小写结果
df.columns
Index(['FooBar', 'SpamEggs', 'Monty-Python'], dtype='object')

df.columns.str.replace('[\W]', '')\
          .str.replace('(?<!^)([A-Z])', r'_\1')\
          .str.lower()
Index(['foo_bar', 'spam_eggs', 'monty_python'], dtype='object')

这个解决方案很好地概括了。将结果分配回df.columns

【讨论】:

  • 哦,强大的正则表达式之王,它就像一个魅力!谢谢!
猜你喜欢
  • 2011-05-28
  • 2015-03-31
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
相关资源
最近更新 更多