x、 拆分给定索引器:列表索引超出范围

2024-05-13 21:49:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码如下所示

   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 “最低工资”可以正常工作,但“最高工资”不断出现错误。我做错什么了吗


Tags: 数据lambda代码错误hrminmaxint
3条回答

像这样试试。如果“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")

你可以试试这样的

正如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

请注意,这些解决方案都不会将数据转换为数字类型

相关问题 更多 >