Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对多索引数据帧上的重复行求和_Python_Pandas_Dataframe_Multi Index - Fatal编程技术网

Python 对多索引数据帧上的重复行求和

Python 对多索引数据帧上的重复行求和,python,pandas,dataframe,multi-index,Python,Pandas,Dataframe,Multi Index,你好,我和熊猫打交道有困难。我试图对多索引数据帧上的重复行求和。 我尝试了df.groupby(level=[0,1]).sum(),也尝试了df.stack().reset\u index().groupby(['year','product']).sum()和其他一些,但我无法让它工作。 我还想为每一年添加每一种独特的产品,如果没有列出,则给它们一个0值 示例:具有多索引和3种不同产品(A、B、C)的数据帧: 预期产出:如果给定年份存在重复产品,则我们将其相加。 如果其中一种产品一年内未上市

你好,我和熊猫打交道有困难。我试图对多索引数据帧上的重复行求和。 我尝试了
df.groupby(level=[0,1]).sum()
,也尝试了
df.stack().reset\u index().groupby(['year','product']).sum()
和其他一些,但我无法让它工作。 我还想为每一年添加每一种独特的产品,如果没有列出,则给它们一个0值

示例:具有多索引和3种不同产品(A、B、C)的数据帧:

预期产出:如果给定年份存在重复产品,则我们将其相加。 如果其中一种产品一年内未上市,我们将创建一个充满0的新行

                  volume1     volume2
year   product
2010   A          17          15
       B          7           7
       C          0           0
2011   A          10          10
       B          7           6
       C          5           5
有什么想法吗?谢谢

与和一起使用
sum

备选方案包括:

备选方案1,谢谢@Wen:

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


您可以将索引的第二级设置为
CategoricalIndex
,当您使用
groupby
时,它将包括所有类别

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

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

也许您可以添加df.sum(level=[0,1]).unstack().stack(dropna=False)这个答案非常完美。非常微妙的一点是,
mux
也可以在
sum
之前创建。这意味着相同的解决方案可以通过
df.sum(level=[0,1]).reindex(pd.MultiIndex.from_product(df.index.levels,names=df.index.names),fill_value=0)很容易地进行流水线处理。
df = df.sum(level=[0,1])
#same as
#df = df.groupby(level=[0,1]).sum()
mux = pd.MultiIndex.from_product(df.index.levels, names = df.index.names)
df = df.reindex(mux, fill_value=0)
df = df.sum(level=[0,1]).unstack().stack(dropna=False) 
print (df)
              volume1  volume2
year product                  
2010 A             17       15
     B              7        7
     C              0        0
2011 A             10       10
     B              7        6
     C              5        5
df.index.set_levels(pd.CategoricalIndex(df.index.levels[1]), 1, inplace=True)
df.groupby(level=[0, 1]).sum().fillna(0, downcast='infer')

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