python pandas - 在groupby之后选择特定值

时间:2018-02-17 16:24:03

标签: python pandas pandas-groupby multi-index

我有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

请帮助函数,它接受整数(Age)并在此Age-group中返回带有MIN raitings的Movie。 示例def(1)应该返回4(组年龄中的最小值(1)= 5.5,电影(5.5)= 4)

我可以得到最小的Raiting:

df['Raitings'].min()

但我不知道 - 如何在特定群体(年龄)中受到激怒?

4 个答案:

答案 0 :(得分:4)

来源多指数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

答案 1 :(得分:4)

这可以一次性完成所有这些。

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'])

答案 2 :(得分:0)

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

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

如果您想对整个数据框执行此操作,您可以执行以下操作:

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

我希望它有所帮助,

答案 3 :(得分:0)

我将重塑并转动。认为它会有所帮助

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