将max应用于datafram的变维子集

2024-10-02 04:26:11 发布

您现在位置:Python中文网/ 问答频道 /正文

对于具有重复索引的索引列的dataframe,我尝试按索引获取在不同列中找到的最大值,并将其分配给第三列,以便对于任何给定行,我们可以看到在具有相同索引的任何行中找到的最大值。 我在一个非常大的数据集上做这件事,如果可能的话,我希望它是矢量化的。现在,我根本无法让它工作

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

Tags: 数据dataframe矢量化locpd集上transposemaxvalue
1条回答
网友
1楼 · 发布于 2024-10-02 04:26:11

看起来这是groupby转换的一个好例子,它可以获得每个索引组的最大值,并将它们转换回原始索引(而不是分组索引):

multiindexDF['maxValuePerIndex'] = multiindexDF.groupby("theIndex")["theValue"].transform("max")

获取SettingWithCopyWarning的原因是,在.loc调用中,您获取了一个切片并在那里设置了值,请参见中的两对方括号:

multiindexDF.loc[matchingIndices]['maxValuePerIndex'] = maxValue

因此,它尝试将值分配给切片而不是原始数据帧,您在链中执行一个.loc,然后在它之后执行另一个[]

因此,使用您最初的方法:

for i in uniqueIndices:
    matchingIndices = multiindexDF['theIndex'] == i
    maxValue = multiindexDF.loc[matchingIndices, 'theValue'].max()
    multiindexDF.loc[matchingIndices, 'maxValuePerIndex'] = maxValue

(注意,我还更改了第一个.loc,您错误地使用了布尔索引)

相关问题 更多 >

    热门问题