Как суммировать столбцы, содержащие массивы - PullRequest
1 голос
/ 15 июня 2019

У меня проблема с суммированием столбцов кадра данных, содержащих массивы в каждой ячейке. dataframe Я попытался суммировать столбцы с помощью df.sum (), ожидая получить общий массив столбцов, например [4,1,1,4,1] для столбца 'common'. Но я получил только пустую серию.

df_sum = df.sum()
print(df_sum)

Series([], dtype: float64)

Как я могу получить суммированную колонку в этом случае?

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Что ж, работать с object dtypes в пандах DataFrames обычно не очень хорошая идея, особенно заполнение ячеек списками python, потому что вы теряете производительность.

Тем не менее, вы можете сделать это, используя itertools.chain.from_iterable

df.apply(lambda s: list(it.chain.from_iterable(s.dropna())))

Вы также можете использовать sum, но я бы сказал, что это медленнее

df.apply(lambda s: s.dropna().sum())

Я понимаю, почему вы думаете df.sum будет работать здесь, даже если явно установить skipna=True, но векторизация df.sum показывает странное поведение в этой ситуации.Но опять же, это недостатки использования DataFrame со списками в нем

0 голосов
/ 15 июня 2019

IIUC, вы, вероятно, можете просто использовать понимание списка для выполнения своей задачи:

df = pd.DataFrame({'d1':[np.nan, [1,2], [4]], 'd2':[[3], np.nan, np.nan]})

>>> df
       d1   d2
0     NaN  [3]
1  [1, 2]  NaN
2     [4]  NaN

df_sum = [i for a in df['d1'] if type(a) is list for i in a]

>>> df_sum
[1, 2, 4]

Если вам нужно сделать сумму для всего DataFrame (или нескольких столбцов), тогда используйте numpy.ravel() , чтобы сгладить фрейм данных перед использованием понимания списка.

df_sum = [i for a in np.ravel(df.values) if type(a) is list for i in a]

>>> df_sum
[3, 1, 2, 4]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...