【问题标题】:python pandas - select particular values after groupbypython pandas - 在groupby之后选择特定值
【发布时间】:2018-07-28 08:12:09
【问题描述】:

我有 groupby 表:

df.groupby(['Age', 'Movie']).mean()

                  User  Raitings
Age Movie
1   1         4.666667  7.666667
    2         4.666667  8.000000
    3         2.000000  7.500000
    4         2.000000  5.500000
    5         3.000000  7.000000
18  1         3.000000  7.500000
    2         3.000000  8.000000
    3         3.000000  8.500000
25  1         8.000000  7.250000
    2         8.000000  7.500000
    3         5.500000  8.500000
    4         5.000000  7.000000
45  1         9.000000  7.500000
    2         9.000000  7.500000
    3        11.000000  7.000000
    4        11.000000  6.000000
60  1         8.000000  7.000000
    2         8.000000  9.000000
    3         8.000000  7.000000

请帮助函数,它接受整数(年龄)并返回此年龄组中具有 MIN raitings 的电影。 示例 def(1) 应返回 4(组 Age(1) = 5.5,Movies(5.5) = 4 中的最小 Raitings)

我可以得到 min Raiting:

df['Raitings'].min()

但我不知道 - 如何在特定组(年龄)中获得 raiting?

【问题讨论】:

  • 我不明白你是怎么得到 4 的
  • 示例:我有 18 岁,在这个组中,“Raitings”列中的最小整数 - 7.5,对应的电影 - 1

标签: python pandas pandas-groupby multi-index


【解决方案1】:

我将重塑并做支点。认为它会有所帮助

df.reset_index(inplace = true)
df_Min = pd.pivot_table(df,index = [‘Movie’, ‘User’], columns =‘Age’, values = ‘Raiting’, aggfunc = min )

【讨论】:

    【解决方案2】:

    这样一来就可以全部搞定。

    df.groupby('Age').Raitings.idxmin().str[-1]
    
    Age
    1     4
    18    1
    25    4
    45    4
    60    1
    Name: Raitings, dtype: int64
    

    如果你想要一个函数,我会使用pd.DataFrame.xs(xs 代表横截面)。
    默认情况下,xs 将从索引的第一级抓取并随后删除该级别。这很方便地留下了我们想要绘制 idxmin 将交给我们的值的级别。

    def f(df, age):
        return df.xs(age).Raitings.idxmin()
    
    f(df, 1)
    
    4
    

    设置
    对于那些试图解析这些东西的人很有用。

    txt = """\
    Age  Movie       User  Raitings
    1.0  1       4.666667  7.666667
         2       4.666667  8.000000
         3       2.000000  7.500000
         4       2.000000  5.500000
         5       3.000000  7.000000
    18.0 1       3.000000  7.500000
         2       3.000000  8.000000
         3       3.000000  8.500000
    25.0 1       8.000000  7.250000
         2       8.000000  7.500000
         3       5.500000  8.500000
         4       5.000000  7.000000
    45.0 1       9.000000  7.500000
         2       9.000000  7.500000
         3      11.000000  7.000000
         4      11.000000  6.000000
    60.0 1       8.000000  7.000000
         2       8.000000  9.000000"""
    
    df = pd.read_fwf(pd.io.common.StringIO(txt))
    df = df.ffill(downcast='infer').set_index(['Age', 'Movie'])
    

    【讨论】:

      【解决方案3】:

      来源多索引DF:

      In [221]: x
      Out[221]:
                       User  Raitings
      Age  Movie
      1.0  1       4.666667  7.666667
           2       4.666667  8.000000
           3       2.000000  7.500000
           4       2.000000  5.500000
           5       3.000000  7.000000
      18.0 1       3.000000  7.500000
           2       3.000000  8.000000
           3       3.000000  8.500000
      25.0 1       8.000000  7.250000
           2       8.000000  7.500000
           3       5.500000  8.500000
           4       5.000000  7.000000
      45.0 1       9.000000  7.500000
           2       9.000000  7.500000
           3      11.000000  7.000000
           4      11.000000  6.000000
      60.0 1       8.000000  7.000000
           2       8.000000  9.000000
           3       8.000000  7.000000
      

      功能:

      In [222]: def f(df, age):
           ...:     return df.loc[pd.IndexSlice[age,:], 'Raitings'].idxmin()[1]
           ...:
      

      测试:

      In [223]: f(x, age=1)
      Out[223]: 4
      

      【讨论】:

      • @VakarinDmitriy 如果有效,您可以标记为答案,单击帖子左侧的复选标记(向下箭头下方)
      • 嗨,我们怎样才能让这两个列都说“用户”和“raitings”以及“用户”何时是字符串。?就我而言,我有“组”而不是从“0”开始的“年龄”
      • @i1100362,我建议你用一个小样本输入数据集和你想要的数据集打开一个新问题......我不太清楚你想得到什么输出。你在df.loc[pd.IndexSlice[1,:], :]之后吗?
      【解决方案4】:

      如果您想要特定年龄的最低要求,您可以这样做:

      df["Age"==1]['Raitings'].min()
      

      如果你想为整个数据框做这件事,你可以这样做:

      df.groupby("Age").agg({ "Raitings" : "min" })
      

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-16
        • 1970-01-01
        • 2020-05-10
        • 2015-02-13
        • 1970-01-01
        • 2019-06-25
        相关资源
        最近更新 更多