首页 > 解决方案 > 数据框中不存在索引的聚合

问题描述

df = pd.DataFrame({'x':[1,2,3,4,5,6],'y':[7,8,9,10,11,12],'z':['a','a','a','b','b','b']})
i = pd.Index([0,3,5,10,20])

中的索引i来自较大的数据帧,并且df是该较大数据帧的子集。所以会有索引 in ithat 不会 in df。当我做

df.groupby('z').aggregate({'y':lambda x: sum(x.loc[i])}) #I know I can just use .aggregate({'y':sum}), this is just an example to illustrate my problem

我得到这个输出

   y
z    
a NaN
b NaN

以及警告信息

__main__:1: FutureWarning: 
Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.

如何避免此警告消息并获得正确的输出?在我的示例中,唯一有效的索引df是,[0,3,5]因此预期的输出是:

   y
z    
a  7 #"sum" of index 0 
b  22 #sum of index [3,5]

编辑

这里的答案很有效,但它们不允许不同类型的聚合xy列。例如,假设我想对 的所有元素求和x,但y只对 index 中的元素求和i

df.groupby('z').aggregate({'x':sum, 'y': lambda x: sum(x.loc[i])})

这是所需的输出:

   y   x                       
z    
a  7   6
b  22  15

标签: pythonpandasaggregate

解决方案


编辑更新的问题:

df.groupby('z').agg({'x':'sum','y':lambda r: r.reindex(i).sum()})

输出:

    x   y
z        
a   6   7
b  15  22

使用reindex, 仅从 i 中选择那些索引,然后dropna从中删除所有这些 nan,因为 i 中的索引不在 df 中。然后groupybyagg

df.reindex(i).dropna(how='all').groupby('z').agg({'y':'sum'})

或者,你真的不需要dropna:

df.reindex(i).groupby('z').agg({'y':'sum'})

输出:

      y
z      
a   7.0
b  22.0

推荐阅读