python-在groupby之后选择特定值
我有分组表:python-在groupby之后选择特定值,python,pandas,pandas-groupby,multi-index,Python,Pandas,Pandas Groupby,Multi Index,我有分组表: 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.00000
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
请提供函数帮助,该函数接受整数(年龄)并返回此年龄组中带有最小衣服的电影。
示例def(1)应返回4(组年龄(1)=5.5的最小服装,电影(5.5)=4)
我可以得到min Raiting:
df['Raitings'].min()
但我不知道-如何在特定的群体(年龄)中获得衣服?如果您想要特定年龄的最低要求,您可以:
df["Age"==1]['Raitings'].min()
如果要对整个数据帧执行此操作,可以执行以下操作:
df.groupby("Age").agg({ "Raitings" : "min" })
我希望它有帮助,源多索引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]
...:
测试:
这让他们一次就搞定了
df.groupby('Age').Raitings.idxmin().str[-1]
Age
1 4
18 1
25 4
45 4
60 1
Name: Raitings, dtype: int64
如果您想要函数,我会使用(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'])
我将重塑和做枢轴。我认为这会有帮助
df.reset_index(inplace = true)
df_Min = pd.pivot_table(df,index = [‘Movie’, ‘User’], columns =‘Age’, values = ‘Raiting’, aggfunc = min )
我不明白你是怎么得到4的例子:我18岁,在这个组中,“衣服”-7.5栏中的最小整数,对应的电影-1@VakarinDmitriy如果有效,您可以将其标记为答案,单击帖子左侧的复选标记(向下箭头下)嗨,我们如何让两列都显示“user”和“raitings”,以及何时“user”是string。?。在我的例子中,我使用的是'group'而不是'age',从'0'开始@i1100362,我建议您使用一个小样本输入数据集和所需的数据集来打开一个新问题。。。我不太清楚你想要什么作为输出。你在找df.loc[pd.indexlice[1,:],:]?
df.reset_index(inplace = true)
df_Min = pd.pivot_table(df,index = [‘Movie’, ‘User’], columns =‘Age’, values = ‘Raiting’, aggfunc = min )