python - 数据框中不存在索引的聚合
问题描述
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 i
that 不会 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]
编辑
这里的答案很有效,但它们不允许不同类型的聚合x
和y
列。例如,假设我想对 的所有元素求和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
解决方案
编辑更新的问题:
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 中。然后groupyby
和agg
:
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
推荐阅读
- go - 如何检查一个包直接依赖/间接依赖于另一个包?
- swift - 是修改json解析字典数组的任何函数
- java - Gradle 项目可以继承多个父项目吗?
- python - 通过 python 脚本在 Abaqus 中获取装配量的问题
- macos - 如何允许从 cups 后端运行的 tea4cups 写入 tmp 目录?
- grep - 如何在不更改输出顺序的情况下使用 grep
- perl - perl: utf8
不映射到 Unicode 而 似乎不存在 - python - 独立函数中的`multiprocessing.Pool`
- c# - 在 Web API 中使用 Route 属性的可选日期参数
- azure - Azure 上的 Spark SSD