【问题标题】:Return a list of values that match a minimum condition [Pandas]返回符合最低条件的值列表 [Pandas]
【发布时间】:2022-11-15 03:12:38
【问题描述】:

我有一个数据框,我希望返回一个列表,其中包含与每个细分市场的最低成本相匹配的所有值。数据框如下所示:

Segment Part ID Cost
1 1 $0.5
- - -
1 2 $0.6
1 3 $0.5
1 4 $0.7
2 5 $0.4
2 6 $0.5
2 7 $0.6

等等。

我希望最终得到的是一个像这样的新数据框:

Segment Part List Min. Cost
1 [1,3] $0.5
2 [5] $0.4

我正在努力完成这项工作。我尝试了几件事:

df['Min Segment Price'] = df.groupby(*['Segment']['Cost'].transform(min)

此行正确地向完整数据框添加了一列,以说明该细分市场的最低价格。

        min_part_list= df['Part ID'].loc[df['Cost'].eq(df['Cost'].min())].to_list()

似乎它只返回段的第一个最小值,而不是全部。

我也试过这个:

        df['Segment Min Part ID']= df['Part ID'].loc[df['Cost'].eq(df['Cost'].min())]

并且它仅在数据框价格最低的行中返回部件 ID,而不是每个段的价格最低的行。我不确定如何添加有关细分市场最低价格的额外资格。

谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用双 groupby,一个用于过滤,另一个用于聚合:

    s = pd.to_numeric(df['Cost'].str.strip('$'))
    
    out = (df[s.eq(s.groupby(df['Segment']).transform('min'))]
           .groupby('Segment', as_index=False)
           .agg({'Part ID': list, 'Cost': 'first'})
           )
    

    输出:

       Segment Part ID  Cost
    0        1  [1, 3]  $0.5
    1        2     [5]  $0.4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 2014-10-29
      • 2021-04-23
      • 2017-11-24
      • 2019-01-02
      • 1970-01-01
      相关资源
      最近更新 更多