首页 > 解决方案 > 将 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

标签: pythonpandas

解决方案


看起来这是 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您错误使用布尔索引的第一个)


推荐阅读