这更像是一个一般的正则表达式问题,而不是 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
将解析逻辑移动到单独的函数的优点是:
- 它可以在其他代码中重用
- 其他人更容易阅读,即使他们不是熊猫专家
- 单独开发和测试解析功能更容易