通过查找“£”然后转换为最小值、最大值来拆分列

数据挖掘 数据集 统计数据 熊猫
2022-02-12 18:01:50

我有一个带有薪水列的熊猫数据框,其中包含以下值:

£36,000 - £40,000 每年加上优厚的福利......,£26,658 至 £32,547 等

我隔离了该列并将其与视图拆分,以便稍后通过 pandas 中的列绑定重新组合到数据框中。

我现在有一个带有如下列的对象。我认为拆分原始数据框列的列是空白的,因为我没有指定它们(我称为df['salary']=df['salary'].astype(str).str.split()

所以我的新对象包含这种类型的信息:

[26,658 英镑,至 32,547 英镑],[具有竞争力,具有,优秀,优势]

我想做的是:

  1. 创建名为 minvalue 和 maxvalue 和 realvalue 的三列
  2. 列出以 £ 开头的项目(与"^£"?
  3. 直到找到忽略£的项目结束(取出数字)(与?有关(substr(x,2,nchar(x)))
  4. 如果找到两个这样的项目,则将第一个数字称为“minvalue”,将第二个数字称为“maxvalue”,并将其放在右列下方。如果该行中只有一个值,请将其放在 realvalue 列的下方。

我对 pandas 和一般编程非常陌生,但热衷于学习,我们将不胜感激。

2个回答

这更像是一个一般的正则表达式问题,而不是 pandas 特定的问题。

我将首先创建一个从字符串中提取所需数字的函数,然后使用该pandas.DataFrame.apply函数将其应用于包含字符串的 pandas 列。这是我要做的:

import re
def parseNumbers(salary_txt):
    return [int(item.replace(',','')) for item in re.findall('£([\d,]+)',salary_txt)]

#testing if this works
testcases = ['£23,000 to £100,000','£34,000','£10000']
for testcase in testcases:
    print testcase,parseNumbers(testcase)

在这里,我刚刚使用了re.findall,它找到了所有看起来像£([\d,]+). 这是以 £ 开头,后跟任意数字和逗号序列的任何内容。括号告诉 python 只提取 £ 符号后面的位。我做的最后一件事是删除逗号,并将剩余的字符串解析为整数。我猜你可能会更优雅,但它确实有效。

在熊猫中使用此功能

df['salary_list'] = df['salary'].apply(parseNumbers)
df['minsalary'] = df['salary'].apply(parseNumbers).apply(min)
df['maxsalary'] = df['salary'].apply(parseNumbers).apply(max)

检查这一切是否有效:

import pandas
df = pandas.DataFrame(testcases,columns = ['salary'])
df['minsalary'] = df['salary'].apply(parseNumbers).apply(min)
df['maxsalary'] = df['salary'].apply(parseNumbers).apply(max)
df

    salary  minsalary   maxsalary
0   £23,000 to £100,000 23000   100000
1   £34,000 34000   34000
2   £10000  10000   10000

将解析逻辑移动到单独的函数的优点是:

  1. 它可以在其他代码中重用
  2. 其他人更容易阅读,即使他们不是熊猫专家
  3. 单独开发和测试解析功能更容易

您可以通过执行来检查列的数据类型df.dtypes,如果'salary'不是字符串,您可以使用 进行转换df['salary'] = df['salary'].astype(str)这是你在分裂之前已经在做的事情。从那里开始,Ferenc 的方法应该奏效了!