У меня есть фреймворк pandas, который выглядит следующим образом:
X Y
71455 [334.0, 319.0, 298.0, 323.0]
71455 [3.0, 8.0, 13.0, 10.0]
57674 [54.0, 114.0, 124.0, 103.0]
Я хочу выполнить агрегат groupby
, который добавляет списки, хранящиеся в столбцах Y, поэлементно. Код, который я пробовал:
df.groupby('X').agg({'Y' : sum})
Результат следующий:
Y
X
71455 [334.0, 319.0, 298.0, 323.0, 75.0, 55.0, ...
Таким образом, он объединяет списки, а не суммирует их поэлементно. Ожидаемый результат, однако:
X Y
71455 [337.0, 327.0, 311.0, 333.0]
57674 [54.0, 114.0, 124.0, 103.0]
Я пробовал разные методы, но не смог заставить это работать как ожидалось.
3 ответа
Можно использовать apply
на сгруппированном фрейме данных, чтобы получить поэлементное дополнение:
df.groupby('X')['Y'].apply(lambda x: [sum(y) for y in zip(*x)])
В результате получается объект серии панд:
X
57674 [54.0, 114.0, 124.0, 103.0]
71455 [337.0, 327.0, 311.0, 333.0]
Панды не предназначены для использования с сериями списков. Такая попытка вынуждает Панд использовать серию object
dtype, которой нельзя манипулировать векторизованным способом. Вместо этого вы можете разбить ваши серии списков на числовые серии перед агрегацией:
import pandas as pd
df = pd.DataFrame({'X': [71455, 71455, 57674],
'Y': [[334.0, 319.0, 298.0, 323.0],
[3.0, 8.0, 13.0, 10.0],
[54.0, 114.0, 124.0, 103.0]]})
df = df.join(pd.DataFrame(df.pop('Y').values.tolist()))
res = df.groupby('X').sum().reset_index()
print(res)
X 0 1 2 3
0 57674 54.0 114.0 124.0 103.0
1 71455 337.0 327.0 311.0 333.0
Если вы преобразуете свои списки в numpy
массивы sum
будут работать:
df['Y'] = df['Y'].apply(np.array)
df.groupby('X')['Y'].apply(np.sum)
#X
#57674 [54.0, 114.0, 124.0, 103.0]
#71455 [337.0, 327.0, 311.0, 333.0]
#Name: Y, dtype: object
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.