Панды применяются, когда ячейки содержат списки - PullRequest
0 голосов
/ 01 октября 2018

У меня есть DataFrame, где один столбец содержит списки в качестве содержимого ячейки, что-то вроде следующего:

import pandas as pd
df = pd.DataFrame({
    'col_lists': [[1, 2, 3], [5]],
    'col_normal': [8, 9]
})

>>> df
   col_lists  col_normal
0  [1, 2, 3]           8
1        [5]           9

Я хотел бы применить некоторые преобразования к каждому элементу col_lists, например:

df['col_lists'] = df.apply(
    lambda row: [ None if (element % 2 == 0) else element for element in row['col_lists'] ], 
    axis=1
)

>>> df
      col_lists  col_normal
0  [1, None, 3]           8
1           [5]           9

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

df2 = pd.DataFrame({
    'col_lists': [[1, 2], [5]], # length of first list is smaller here
    'col_normal': [8, 9]
})

df2['col_lists'] = df2.apply(
    lambda row: [ None if (element % 2 == 0) else element for element in row['col_lists'] ], 
    axis=1
)

>>> df2
   col_lists  col_normal
0        1.0           8
1        5.0           9

У меня два вопроса:

(1) Что здесь происходит?Почему я получаю правильный результат в случае df, но не df2?

(2) Как правильно применить некоторые преобразования к спискам в пределах DataFrame?

1 Ответ

0 голосов
/ 01 октября 2018

Во-первых, я думаю, что работа с list s в пандах - это не хорошая идея .

Но если это действительно нужно, попробуйте обновить панд, потому что для меня это хорошо работает в pandas 0.23.4:

df2['col_lists'] = df2.apply(
    lambda row: [ None if (element % 2 == 0) else element for element in row['col_lists'] ], 
    axis=1
)

print (df2)
   col_lists  col_normal
0  [1, None]           8
1        [5]           9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...