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