Панды: объединение повторяющихся значений индекса - PullRequest
1 голос
/ 12 марта 2019

У меня есть серия панд, которую я хотел бы объединить тремя разными способами.Серия выглядит следующим образом:

import pandas as pd
timestamps = [1,1,1,2,3,3,3,4]
quantities = [10,0,2,6,7,2,8,0]
series = pd.Series(quantities, index=timestamps)

Очевидно, что временные метки имеют значения 3 values of 1, 1 value of 2, 3 values of 3 и 1 value of 1.Я хотел бы создать следующие серии:

1.Сумма повторяющихся значений индекса:

pd.Series([12,6,17,0], index=[1,2,3,4])

2.Медиана повторяющихся значений индекса:

pd.Series([2,6,7,0], index=[1,2,3,4])

2.Число повторяющихся значений индекса:

pd.Series([3,1,3,1], index=[1,2,3,4])

В numpy Я бы достиг этого, используя метод unique_elements_to_indices:

from typing import Dict
import numpy as np
def unique_elements_to_indices(array: np.array) -> Dict:
    mapping = {}
    for unique_element in np.unique(array):
        mapping[unique_element] = np.where(array == unique_element)[0]
    return mapping

... и затем я быпереберите unique_elements и используйте np.where, чтобы найти quantities для данного unique_element.

Есть ли что-нибудь для быстрого достижения этого в пандах, пожалуйста?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 12 марта 2019

Здесь можно использовать функции sum, median для отдельных выходов с параметром level=0 для агрегирования по индексу:

print (series.sum(level=0))
print (series.median(level=0))

Но в целом агрегируется по индексу с функцией:

print (series.groupby(level=0).sum())
print (series.groupby(level=0).median())
#difference between count and size is count exclude NaNs values
print (series.groupby(level=0).size())

print (series.groupby(level=0).count())

При необходимости все вместе для нового DataFrame используйте GroupBy.agg со списком агрегатных функций:

print(series.groupby(level=0).agg(['sum', 'median', 'size']))
0 голосов
/ 12 марта 2019

Когда вы работаете с библиотекой pandas, рекомендуется конвертировать ваши данные в фрейм данных. Самый простой способ, как показано ниже в пандах

timestamps = [1,1,1,2,3,3,3,4]
quantities = [10,0,2,6,7,2,8,0]
d = {'quantities': quantities, 'timestamps': timestamps}
df = pd.DataFrame(d)
df.groupby('timestamps').sum().reset_index()

Аналогичным образом вы также можете использовать другие функции. Пожалуйста, дайте мне знать, если это работает для вас.

0 голосов
/ 12 марта 2019

Вы можете использовать .groupby для этого:

import pandas as pd
timestamps = [1,1,1,2,3,3,3,4]
quantities = [10,0,2,6,7,2,8,0]
sr = pd.Series(quantities, index=timestamps)

print(sr.groupby(sr.index).sum())
print(sr.groupby(sr.index).median())
print(sr.groupby(sr.index).count())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...