【问题标题】:Python Pandas: Get row by median valuePython Pandas:按中值获取行
【发布时间】:2014-06-09 16:18:45
【问题描述】:

我正在尝试获取列的中值所在的行。

我正在使用 data.median() 来获取“列”的中值。

id                 30444.5
someProperty           3.0
numberOfItems          0.0
column                70.0

而 data.median()['column'] 随后是:

data.median()['performance']
>>> 70.0

如何获取行或索引的中值? 有没有类似于 idxmax / idxmin 的东西?

我尝试过过滤,但在多行具有相同值的情况下它不可靠。

谢谢!

【问题讨论】:

标签: python pandas


【解决方案1】:

您可以使用rankidxmin 并将其应用于每一列:

import numpy as np
import pandas as pd


def get_median_index(d):
    ranks = d.rank(pct=True)
    close_to_median = abs(ranks - 0.5)
    return close_to_median.idxmin()
df = pd.DataFrame(np.random.randn(13, 4))
df
    0           1           2           3
0   0.919681    -0.934712   1.636177    -1.241359
1   -1.198866   1.168437    1.044017    -2.487849
2   1.159440    -1.764668   -0.470982   1.173863
3   -0.055529   0.406662    0.272882    -0.318382
4   -0.632588   0.451147    -0.181522   -0.145296
5   1.180336    -0.768991   0.708926    -1.023846
6   -0.059708   0.605231    1.102273    1.201167
7   0.017064    -0.091870   0.256800    -0.219130
8   -0.333725   -0.170327   -1.725664   -0.295963
9   0.802023    0.163209    1.853383    -0.122511
10  0.650980    -0.386218   -0.170424   1.569529
11  0.678288    -0.006816   0.388679    -0.117963
12  1.640222    1.608097    1.779814    1.028625
df.apply(get_median_index, 0)
0    7
1    7
2    3
3    4

【讨论】:

    【解决方案2】:

    可能只是:data[data.performance==data.median()['performance']]

    【讨论】:

    • 这很好,虽然它确实返回了一组结果。在这种情况下,'performance' == 70 的所有值。
    • 是的,我正要指出这一点。您可能希望从多个匹配项中随机选择一个,而不是总是选择第一个或最后一个,以避免潜在的偏见。时间序列数据尤其如此。
    • 这在数据集具有偶数个值的情况下是不正确的。中位数将是两个中间值之间的平均值,并且不会出现在数据集中。因此,Series([], dtype: float32)
    • @layser 对于您所描述的内容,应该得到匹配,完全符合结果。至于找到与中位数最接近的价值指数,这是一个不同的问题
    • 如果有奇数个元素,我不确定这是否有效(没有单个元素会等于中位数,因为中位数是两个元素的平均值)。
    猜你喜欢
    • 2022-11-02
    • 2021-10-08
    • 1970-01-01
    • 2019-12-07
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 2014-06-02
    相关资源
    最近更新 更多