【问题标题】:For each category, how to find the value of a column corresponding to the minimum of another column?对于每个类别,如何找到与另一列的最小值对应的列的值?
【发布时间】:2021-02-05 23:27:46
【问题描述】:

我有一张像这样的桌子;它是交叉表的堆叠版本,因此项目和期间的每个组合都是唯一的:

+------+--------+-------+
| item | period | value |
+------+--------+-------+
| x    |      1 |     6 |
| x    |      2 |     4 |
| x    |      3 |     5 |
| y    |      1 |     9 |
| y    |      2 |    10 |
| y    |      3 |   100 |
+------+--------+-------+

对于每个项目,我需要找到值最低的时段,所以想要的结果是:

+------+--------+-------+
| item | period | value |
+------+--------+-------+
| x    |      2 |     4 |
| y    |      1 |     9 |
+------+--------+-------+

我已经研究过 pandas.DataFrame.idxmin() 但它似乎不是我需要的。 我找到了一种使用 groupby、min 和 merge 的方法,但我想知道是否有更优雅的解决方案?

我发现了许多与 R 和 SQL 相关的类似问题(我的解决方案实际上是“SQLish”,而不是 Python

我的解决办法是:

import numpy as np
import pandas as pd


df = pd.DataFrame()
df['item'] = np.repeat(['x','y'],3)
df['period'] = np.tile( [1,2,3] ,2 )
df['value'] = [6,4,5,9,10,100]


min_value = df[['item','value']].groupby('item').min().reset_index(drop = False)

periods_with_min_value = pd.merge(min_value, df, how ='inner', on=['item','value'])

【问题讨论】:

    标签: python pandas dataframe aggregate min


    【解决方案1】:
    df.loc[df.groupby("item")["value"].idxmin()]
    Out[12]: 
      item  period  value
    1    x       2      4
    3    y       1      9
    

    在 pandas 1.1.3、python 3.7、debian 10 64 位上测试。没有发出警告。

    注意如果存在重复或损坏的索引值,此解决方案将不起作用。这可以通过.reset_index(drop=True)提前解决。

    【讨论】:

    • 我已经在我的实际数据上尝试过了,我收到一条关于缺少标签的错误消息,我不明白 - idxmin 是否返回缺少的标签? KeyError:“不再支持将列表喜欢传递给带有任何缺失标签的 .loc 或 []。缺少以下标签:Float64Index([nan, nan, nan, nan], dtype='float64')。见 @987654321 @"
    • 您的索引可能已损坏。也许.reset_index(drop=True) 再试一次?我正在使用 pandas 1.1.3 并且没有发出警告。这个操作对我来说似乎很正常。
    • 原来我有一些行的 value = nan,这就是导致问题的原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 2016-12-30
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多