我的代码是这样的
df2['min_salary'] = min_hr.apply(lambda x: int(x.split('-')[0]))
df2['max_salary'] = min_hr.apply(lambda x: int(x.split('-')[1]))
其使用的数据是这样的薪水列80 - 100最低工资可以正常工作,但最高工资不断出现错误。我做错了什么吗?
正如Tim指出的那样,您可能有数据不遵循您试图拆分字符串的确切格式。您可以尝试这种方法,它将NaN
添加到拆分后不会产生两个值的任何列中:
df2[["min_salary", "max_salary"]] = min_hr.str.split("-").apply(pd.Series)
下面是在此数据框的"A"
列上使用该代码(并将两个新列命名为"Ax"
和"Ay"
)后的示例输出:
A Ax Ay
0 10-20 10 20
1 30-40 30 40
2 70 70 NaN
注意,如果您希望将单个工资值填充到"max_salary"
列,则需要使用稍微不同的方法:
df2[["min_salary", "max_salary"]] = min_hr.split("-").apply(lambda x: [np.nan]*(len(x) < 2) + x).to_list()
将70
放到Ay
列:
A Ax Ay
0 10-20 10 20
1 30-40 30 40
2 70 NaN 70
另一种方法(在这种特殊情况下可能是理想的)是横向填充NaN
:
df2[["min_salary", "max_salary"]] = min_hr.str.split("-").apply(pd.Series).ffill(axis=1)
A Ax Ay
0 10-20 10 20
1 30-40 30 40
2 70 70 70
请注意,这些解决方案都不能将数据转换为数字类型。
试试这样。这应该可以处理'x'中没有-
df2['max_salary'] = min_hr.apply(lambda x: int(x.split('-')[1] if len(x.split('-'))>1 else x.split('-')[0]))
def min_max_value(sal_string):
fields = x.split('-')
if len(fields)>1:
if fields[0].strip().isdigit():
min_field = int(fields[0].strip())
else:
min_field = None
if fields[1].strip().isdigit():
max_field = int(fields[0].strip())
else:
max_field = None
else:
if fields[0].strip().isdigit():
min_field = int(fields[0].strip())
else:
min_field, max_field = None, None
return min_field, max_field
df2[['min_salary','max_salary']] = min_hr.apply(min_max_value, result_type="expand")
你可以试试这样做。