我有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()
但我不知道 - 如何在特定群体(年龄)中受到激怒?
答案 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 )