【问题标题】:Dataframe Replace Regex数据框替换正则表达式
【发布时间】:2015-03-09 07:31:11
【问题描述】:

我目前正在尝试将一组 str 值替换为 python 中的 int 值,用于我的 Dataframe。 DataFrame 有 200 多列,包括 Age_Range、Car_Year、Car_Count、Home_Value、Supermarket_Spend_Per_week、Household_Income 等列。

我有以 a 开头的答案(在列中)。湾。 C。 d。 e. F。对于不同的响应。

例如 a.低于 2 万美元,b. 20 到 30,000 美元,c。 $30 到 $50k .. 等等。

我已通读 wiki 并知道如何用单词边界等替换。但我想用值 1 替换以 a 开头的任何匹配项,用值 2 替换以 b 开头的任何匹配项。

如何为我的 Dataframe 编写这个?我尝试的所有正则表达式函数都以无效的语法结束

我现在有

income
h. No Answer
f. $100 to $150k
c. $30 to $50k
b. $20 to $30k
b. $20 to $30k
c. $30 to $50k
h. No Answer

我想转换成的

income
8
5
3
2
2
3
7

作为一个整数,我可以更轻松地绘制结果图并搜索列之间的关系。

【问题讨论】:

  • 你试过什么?并且只是给出你期望的输入和输出应该更具体,老实说我不太听从你的问题描述。
  • No Answer 不应该是 8 吗? - 例如,我希望:[8, 6, 3, 2, 2, 3, 8]...虽然,如果没有g,那么我想7 是有道理的...

标签: python regex pandas


【解决方案1】:

您在这里不需要正则表达式,只需创建一个查找表并根据该列的第一个字符应用于您的 DataFrame 的列,例如:

df['income'] = df['income'].apply(lambda L, rep={c:i for i,c in enumerate('abcdefh', 1)}: rep[L[0]])

给你:[7, 6, 3, 2, 2, 3, 7]

要将其应用于所有列,然后遍历列:

for column in df.columns:
    df[column] = df[column].apply(lambda L, rep={c:i for i,c in enumerate('abcdefh', 1)}: rep[L[0]])

【讨论】:

  • 抱歉,如果不清楚,但我有 40 多列的响应与此类似,这就是为什么我想修改整个数据框,而不仅仅是一列
  • @Tobias121 然后将其应用于所有相关列?你能edit你的问题来澄清你到底有什么……吗?
  • 数据集有超过 200 列,这就是为什么我试图找到一个正则表达式,它允许任何 a 变为 1 b 变为 2 等,以用于绘图和分析。
  • @Tobias121 all DF 中的列是否需要相同的替换? (因为Age_Range 看起来应该是不同的查找/根本没有等等......)
  • 数据集中的所有答案都以 a 开头。湾。 C。 d。 e. F。并且需要相同的替换。
【解决方案2】:

这可能是实现目标的一种方式:

>>> re.sub(r"^([abcdef])", lambda x: str(ord(x.group(0))-ord('a')), "b. US$blah blabh")
'1. US$blah blabh' 

它的作用是“匹配字符串开头的字符 'a' 到 'f' 中的任何一个,并将其替换为该字符相对于字母 'a' 的偏移量的字符串表示形式”。对每一行文本重复。

通过一些额外的管道,您可以摆脱输入线的其余部分;有点不清楚你想要什么作为输出。

【讨论】:

  • 我正在尝试将字母字符修改为序数,以便进行大规模绘图。因此,我尝试使用 12345678 转换 abcdefg 响应。
猜你喜欢
  • 1970-01-01
  • 2020-10-06
  • 2021-03-20
  • 2019-01-24
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多