pandas dataframe применяет лямбда-индекс ошибки - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть следующий код

df2['TaxAccNo4'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[0])
df2['TaxAccNo3'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[1])

, где df2:

     TaxAccNo2    
0    00001379.1   
1    00182218    

Когда я запускаю код, я получаю

     TaxAccNo2   TaxAccNo4
0    00001379.1  00001379
1    00182218    00182218

и IndexError: listиндекс вне диапазона для TaxAccNo3,

     TaxAccNo2   TaxAccNo4   TaxAccNo3
0    00001379.1  00001379    1
1    00182218    00182218    

Как мне исправить мой код для получения этого вывода?Я предполагаю, что это дает мне ошибку, потому что у Index 1 нет '.'но я не уверен, как это исправить.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Hy, я просматривал ваш код, проблема в том, что когда вы используете метод split () в строке, возвращаемый объект является списком, и это вызывает ошибку индекса, как вы указали.Решение, с которым я столкнулся, если оно очень простое, использует условное выражение в вашем коде, чтобы оно не вызывало этот индекс для более коротких списков следующим образом.Надеюсь, это поможет.

df2['TaxAccNo3'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[1] if len(x.split('.'))>1 else x)
0 голосов
/ 21 ноября 2018

Как вы сказали, проблема в том, что "00182218".split(".") не имеет индекса [1], поскольку это список ["00182218"].

Простое решение, не затрагивающее слишком много кода, состоит в использовании ... if ... else ... троичного оператора:

df2['TaxAccNo4'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[0])
df2['TaxAccNo3'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[1] if '.' in x else '')

Гдеlast '' - пустая строка, значением которой вы будете заполнять TaxAccNo3, если у TaxAccNo2 нет точки (вы можете заменить ее, если хотите другое поведение).

Семантика: положить x.split('.')[1] в df2['TaxAccNo3'], если x содержит точку, в противном случае поставить пустую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...