Суммируйте дублированные строки в серии многоиндексных панд и вставляйте нули для отсутствующих категорий - PullRequest
0 голосов
/ 23 декабря 2018

этот вопрос очень похож на приведенный здесь:

Сумма дублированных строк на многоиндексном фрейме данных pandas

За исключением случаев, когда речь идет о серии Панд, а неDataFrame Pandas и ответы, данные и принятые для DataFrame, не работают в моей серии.

Скажем, у меня есть многоиндексный pd.Series, называемый s, например:

                  volume1  
year   product
2010   A          10         
       A          7          
       B          7          
2011   A          10         
       B          7          
       C          5     

Ожидаемый результат: если для данного года есть дублированные продукты, то мы суммируем их.Но для пропущенных категорий в год я хотел бы записать sm как «0».Таким образом, серия Pandas, подобная следующей, - это что-то вроде того, что я хочу, чтобы результат выглядел следующим образом:

              volume1
year product         
2010 A             17
     B              7
     C              0
2011 A             10
     B              7
     C              5

Я попробовал все ответы на вопрос, с которым я связан, объясните, как это сделать для pd.DataFrame,такие как:

s = s.sum(level=[0,1]).unstack(fill_value=0).stack()

и

s = s.sum(level=[0,1]).unstack().stack(dropna=False)

Но ничего из этого не работает и, по-видимому, просто заполняет всю серию значениями NaN.Это невероятно расстраивает и должно быть быстрое решение, которое я просто не могу найти.Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Я думаю, что вы ожидаете unstack на предпоследнем уровне.

s.sum(level=[0, 1]).unstack(1, fill_value=0).stack()

              volume1
year product         
2010 A             17
     B              7
     C              0
2011 A             10
     B              7
     C              5

Другой вариант - преобразовать первый уровень в категориальный, тогда расстановка не нужна (это неэффективно).

df.index = df.index.set_levels(pd.Categorical(df.index.levels[1]), level=1)
df.sum(level=[0, 1]).fillna(0, downcast='infer')

              volume1
year product         
2010 A             17
     B              7
     C              0
2011 A             10
     B              7
     C              5
0 голосов
/ 23 декабря 2018

Вы можете groupby сам индекс и сумма внутри групп, что-то вроде этого:

import pandas as pd

# create example series
index = pd.MultiIndex.from_tuples(tuples=[(2010, 'A'), (2010, 'A'), (2010, 'B'), (2011, 'A'), (2011, 'B'), (2011, 'C')],
                                  names=['year', 'product'])
s = pd.Series(data=[10, 7, 7, 10, 7, 5], index=index)

# group by index and sum
result = s.groupby(index).sum()

# re-index the resulting pd.Series
result = result.reindex(pd.MultiIndex.from_tuples(result.index, names=s.index.names))

print(result)

Выход

year  product
2010  A          17
      B           7
2011  A          10
      B           7
      C           5
dtype: int64
...