【发布时间】:2021-03-05 18:59:36
【问题描述】:
这可能是一个简单的解决方案,但我发现很难让这个函数适用于我的数据集。
我有一个工资列,其中包含各种数据。下面的示例数据框:
ID Income desired Output
1 26000 26000
2 45K 45000
3 - NaN
4 0 NaN
5 N/A NaN
6 2000 2000
7 30000 - 45000 37500 (30000+45000/2)
8 21000 per Annum 21000
9 50000 per annum 50000
10 21000 to 30000 25500 (21000+30000/2)
11 NaN
12 21000 To 50000 35500 (21000+50000/2)
13 43000/year 43000
14 NaN
15 80000/Year 80000
16 12.40 p/h 12896 (12.40 x 20 x 52)
17 12.40 per hour 12896 (12.40 x 20 x 52)
18 45000.0 (this is a float value) 45000
@user34974 - 在提供可行的解决方案方面非常有帮助(如下)。但是,该解决方案向我提供了一个错误,因为数据框列也包含浮点值。任何人都可以帮助满足数据框列中可以处理的函数中的浮点值吗?最后更新列中的输出应该是浮点值。
Normrep = ['N/A','per Annum','per annum','/year','/Year','p/h','per hour',35000.0]
def clean_income(value):
for i in Normrep:
value = value.replace(i,"")
if len(value) == 0 or value.isspace() or value == '-': #- cannot be clubbed to array as used else where in data
return np.nan
elif value == '0':
return np.nan
# now there should not be any extra letters with K hence can be done below step
if value.endswith('K'):
value = value.replace('K','000')
# for to and -
vals = value.split(' to ')
if len(vals) != 2:
vals = value.split(' To ')
if len(vals) != 2:
vals = value.split(' - ')
if len(vals) == 2:
return (float(vals[0]) + float(vals[1]))/2
try:
a = float(value)
return a
except:
return np.nan # Either not proper data or need to still handle some fromat of inputs.
testData = ['26000','45K','-','0','N/A','2000','30000 - 45000','21000 per Annum','','21000 to 30000','21000 To 50000','43000/year', 35000.0]
df = pd.DataFrame(testData)
print(df)
df[0] = df[0].apply(lambda x: clean_income(x))
print(df)
【问题讨论】:
-
你能发布你想要的输出吗?我认为在某些情况下它会导致 NaN。例如,您是否期望
30000 - 45000得到两者的平均值?同样对于21000 to 30000的值,您是否期望两者的平均值? -
好。您能否在您的问题部分发布所需的结果,以便我们查看您要查找的内容。解决方案可能比您拥有的大代码要简单得多。
-
基本上,我的目标是转换:1) 40K - 40000 2) 0 - NaN 3) 空白 - NaN 4) 21000 到 22000 - 22000 + 21000/2 5) 80000/年 - 80000 6 ) N/A - NaN 7) 10000 每年 - 10000 8) N/A - NaN 9) 90000/年 - 90000 10) 10000 每年 - 10000 11) 30000 - 45000 - 30000+45000/2 12) - - NaN 13) 45000.0 (float) - 45000.0 14) 12.40 p/h - 12.40 * 20 *52 - 12896 15) 12.40 per hour - 12.40 * 20 *52 - 12896 最后,整列应转换为浮点值。
-
你能把这个贴在主要问题部分吗? cmets 部分中的文本没有适当的缩进。我需要查看普通数据框格式的数据。
-
谢谢乔。刚刚更新了问题部分。
标签: python pandas data-cleaning