Индексирование списков в столбце данных Pandas на основе переменной длины - PullRequest
2 голосов
/ 20 февраля 2020

У меня есть столбец в Pandas массиве данных, состоящем из списков переменной длины, и я пытаюсь найти эффективный способ извлечения элементов, зависящих от длины списка. Рассмотрим этот минимальный воспроизводимый пример:

t = pd.DataFrame({'a':[['1234','abc','444'],
                       ['5678'],
                       ['2468','def']]})

Скажем, я хочу извлечь 2-й элемент (при необходимости) в новый столбец и использовать NaN в противном случае. Я смог получить его очень неэффективным способом:

_ = []
for index,row in t.iterrows():
    if (len(row['a']) > 1): 
        _.append(row['a'][1])
    else:
        _.append(np.nan)
t['element_two'] = _

И я попытался использовать np.where(), но я неправильно указываю аргумент 'if':

np.where(t['a'].str.len() > 1, lambda x: x['a'][1], np.nan)

Исправления и советы для других решений будет принята с благодарностью! Я прихожу из R, где я воспринимаю векторизацию как должное.

Я на pandas 0.25.3 и numpy 1.18.1.

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Использование str Аксессор:

n = 2
t['second'] = t['a'].str[n-1]
print(t)
                  a second
0  [1234, abc, 444]    abc
1            [5678]    NaN
2       [2468, def]    def
1 голос
/ 20 февраля 2020

Несмотря на свою невероятную эффективность, apply по крайней мере чист:

t['a'].apply(lambda _: np.nan if len(_)<2 else _[1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...