【问题标题】:How to use regex in Pandas?如何在 Pandas 中使用正则表达式?
【发布时间】:2020-05-30 21:25:00
【问题描述】:

我已从 .csv 文件中提取列名,现在我想使用正则表达式将单词的第一个字母和_ 字符之后的第一个字母大写。 示例:loan_status -> Loan_Status

Loan_ID
loan_status
Principal
terms
effective_date
due_date
paid_off_time
past_due_days
age
education
Gender

这就是我目前想出的(^[a-z])+\w+

更新 感谢 Wiktor Stribiżew,这就是我想出的。 我想知道是否有更紧凑的方法来执行以下操作。

import csv
import pandas  as pd
import re


dataFrame = pd.read_csv('Loan_payments_data_2020_unclean.csv')

columnsDict = {"columnName": list(dataFrame.columns)}
columnsDataFrame = pd.DataFrame(columnsDict)

replacedColumns = columnsDataFrame['columnName'].str.replace(r'(?<![^_]).', lambda x: x.group().upper())
dataFrame.columns = list(replacedColumns)
print(dataFrame)

【问题讨论】:

  • 也许 string.capwords 在这里会有所帮助:df['Loan_ID'].apply(lambda x: string.capwords(x, sep='_'))

标签: python-3.x regex pandas


【解决方案1】:

你可以使用

>>> df = pd.DataFrame({'Loan_ID': ['loan_status','Principal','terms','effective_date','due_date','paid_off_time','past_due_days','age','education','Gender']})
>>> df['Loan_ID'].str.replace(r'(?<![^_]).', lambda x: x.group().upper())
0       Loan_Status
1         Principal
2             Terms
3    Effective_Date
4          Due_Date
5     Paid_Off_Time
6     Past_Due_Days
7               Age
8         Education
9            Gender
Name: Loan_ID, dtype: object

(?&lt;![^_]). 正则表达式匹配除换行符以外的任何字符,该字符要么位于字符串的开头,要么紧跟在 _ 字符之后。它等于(?:(?&lt;=^)|(?&lt;=_)). 正则表达式,参见its demo online

由于您无法在字符串替换模式中操作匹配的值,因此需要一个可调用对象作为替换参数。 lambda x: x.group().upper() 只是抓取匹配值并将其转换为大写。

【讨论】:

  • 这部分我看不懂(?&lt;![^_])。这是我正在阅读的指南。 regexone.com/lesson/line_beginning_end
  • @bibscy 更详细地说,它是一个否定的lookbehind,它匹配一个不紧跟在任何字符之前但_ 的位置。这意味着 [a-z] 只有在前面有 _ 或字符串开头时才能匹配。与(?:(?&lt;=^)|(?&lt;=_)) 相同,但允许以更短的方式编写。
  • Loan_ID 不是键,它也是列名。我将列提取为列表,然后尝试应用您的方法,但出现错误:'list' object has no attribute 'replace' replacedColumns = list(dataFrame.columns).replace(r'(?&lt;![^_]).', lambda x: x.group().upper())
  • @bibscy 不确定您现在在做什么,但请注意list(dataFrame.columns)字符串列表,您不能将.replace 应用于字符串列表。首先import re,然后使用[re.sub(r'(?&lt;![^_]).', lambda x: x.group().upper(), x) for x in dataFrame.columns]来使用我的解决方案。或者,如果您想使用 Andrej 的解决方案,请使用 import string,然后使用 [string.capwords(x, sep="_") for x in dataFrame.columns]。要替换列名,请使用dataFrame.columns = dataFrame.columns.str.replace(r'(?&lt;![^_]).', lambda x: x.group().upper())
猜你喜欢
  • 2021-05-09
  • 2018-04-24
  • 2020-09-14
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
相关资源
最近更新 更多