获取对应的中位数索引

Nic*_*lia 5 python indexing median dataframe pandas

我有一个包含一列的熊猫数据框,我想知道中位数的索引。也就是说,我这样确定中位数:

df.median()

这给了我中值,但我想知道该行的索引。是否可以确定这一点?对于长度不均匀的列表,我可以搜索具有该值的索引,但对于偶数列表长度,这将不起作用。有人可以帮忙吗?

这个问题在另一篇文章中被问到,答案基本上是搜索与中位数具有相同值的行。但就像我说的,这不适用于偶数长度的列表。

下面是一个最小示例(我在下面包含了 Wen 的建议):

df = pd.DataFrame(np.random.randn(6, 1), columns=list('A'))
df.median()
df.loc[df[0]==df[0].median()]

Out[120]: 
Empty DataFrame
Columns: [0]
Index: []
Run Code Online (Sandbox Code Playgroud)

小智 5

您可以将 Wen 的答案用于奇数长度的数据帧。

对于偶数长度的数据帧,这个问题没有意义。正如您指出的那样,数据框中不存在中位数。但是,您可以按您感兴趣的列对数据框进行排序,然后找到两个“中位数”值的索引。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(6, 1), columns=list('A'))
df.median()

df.loc[df['A']==df['A'].median()]

df.sort_values(by='A', inplace=True)

df[df['A'] > df['A'].median()].iloc[0]
df[df['A'] < df['A'].median()].iloc[-1]
Run Code Online (Sandbox Code Playgroud)

  • 计算中位数的成本很高,当您已经对 DataFrame 进行排序时,您可以只选择中位数条目“df.iloc[int(len(df)/2)]”。 (2认同)

sci*_*ctn 5

另一种方法是使用分位数函数(默认为 0.5,即中位数)并设置参数interpolation,以便它不会尝试分割偶数长度的 DataFrame 上的中点。

import pandas as pd
import numpy as np

df=pd.DataFrame(np.random.randn(6,1), columns=['A'])


# row nearest to midpoint 
df[df['A']==df['A'].quantile(interpolation='nearest')]

# just below the midpoint
df[df['A']==df['A'].quantile(interpolation='lower')]

# just above the midpoint
df[df['A']==df['A'].quantile(interpolation='higher')]
Run Code Online (Sandbox Code Playgroud)