python - 将 max 应用于 pandas 数据帧的变维子集
问题描述
对于具有重复索引的索引列的数据框,我试图通过索引获取在不同列中找到的最大值,并将其分配给第三列,以便对于任何给定的行,我们可以看到最大值在具有相同索引的任何行中找到。我正在对一个非常大的数据集执行此操作,并希望尽可能对其进行矢量化。现在,我根本无法让它工作
multiindexDF = pd.DataFrame([[1,2,3,3,4,4,4,4],[5,6,7,10,15,11,25,89]]).transpose()
multiindexDF.columns = ['theIndex','theValue']
multiindexDF['maxValuePerIndex'] = 0
uniqueIndicies = multiindexDF['theIndex'].unique()
for i in uniqueIndices:
matchingIndices = multiindexDF['theIndex'] == i
maxValue = multiindexDF[matchingIndices == i]['theValue'].max()
multiindexDF.loc[matchingIndices]['maxValuePerIndex'] = maxValue
这失败了,告诉我应该使用 .loc,当我已经在使用它时。不知道错误是什么意思,也不知道如何解决这个问题,所以我不必遍历所有内容,而是可以对其进行矢量化
我在找这个
targetDF = pd.DataFrame([[1,2,3,3,4,4,4,4],[5,6,10,7,15,11,25,89],[5,6,10,10,89,89,89,89]]).transpose()
targetDF
解决方案
看起来这是 groupby 变换的一个很好的例子,这可以获得每个索引组的最大值并将它们转换回它们的原始索引(而不是分组索引):
multiindexDF['maxValuePerIndex'] = multiindexDF.groupby("theIndex")["theValue"].transform("max")
你得到的原因SettingWithCopyWarning
是在你的.loc
调用中你取了一个切片并在那里设置值,请参见下面的两对方括号:
multiindexDF.loc[matchingIndices]['maxValuePerIndex'] = maxValue
因此,它尝试将值分配给切片而不是原始 DataFrame,您正在执行 a .loc
,然后[]
在链中执行另一个。
所以使用你原来的方法:
for i in uniqueIndices:
matchingIndices = multiindexDF['theIndex'] == i
maxValue = multiindexDF.loc[matchingIndices, 'theValue'].max()
multiindexDF.loc[matchingIndices, 'maxValuePerIndex'] = maxValue
(请注意,我还更改了.loc
您错误使用布尔索引的第一个)
推荐阅读
- python - 强化学习不适用于这个非常简单的游戏,为什么?Q学习
- java - 杀死并重新启动应用程序后前台服务没有停止 - Android Studio
- node.js - 节点的事件循环阶段回调
- python - Pandas Dataframe 未使用 .loc 返回列中 1 个字符串值的结果
- spring - 无法在 Eclipse 中启动 Spring Boot App:无法启动嵌入式 Tomcat
- javascript - jquery - 未捕获的类型错误:$(...).draggable 不是函数
- python - 使用 pd.melt() 在时间序列数据上旋转数据帧
- jdbc - HSQLDB 是否支持 setArray 用于查询中的谓词?
- ubuntu - 最近更新后 Vscode 无法检测到扩展
- ssh - ssh 连接被拒绝:tryhackme 学习 Linux 演练