Python 选择";“实体”;其中只有几组其他特征(另一列)

Python 选择";“实体”;其中只有几组其他特征(另一列),python,pandas,Python,Pandas,事先我很抱歉,因为对我来说,只有一个好的英语问题很难表达好 我用熊猫和蟒蛇 让我们假设对于任何游戏(由id表示),都有几个具有其特征的个体。这些特征之一是属于一个组(XL,X,XS) 一件重要的事情是,在一场比赛中,我们只能代表一组个人 然后在我的描述性统计中,考虑到所有的游戏,组XS优于X。 但我真的想确认他们是否真的在比赛中面对小组X 让我们看看数据帧上的groupby方法: DF.groupby(['ID','GROUP']).mean() #notice the only other c

事先我很抱歉,因为对我来说,只有一个好的英语问题很难表达好

我用熊猫和蟒蛇

让我们假设对于任何游戏(由id表示),都有几个具有其特征的个体。这些特征之一是属于一个组(
XL
X
XS

一件重要的事情是,在一场比赛中,我们只能代表一组个人
然后在我的描述性统计中,考虑到所有的游戏,组
XS
优于
X
。 但我真的想确认他们是否真的在比赛中面对小组
X

让我们看看数据帧上的
groupby
方法:

DF.groupby(['ID','GROUP']).mean() #notice the only other column is the score
+---------+-------+---------------+
|   ID    | GROUP | MEAN OF SCORE |
+---------+-------+---------------+
| 1000046 | XS    |          4.50 |
| 1000047 | XS    |          6.41 |
| 1000051 | X     |          3.00 |
|         | XS    |          3.75 |
+---------+-------+---------------+
数据帧类似于:

+---------+-------+-------+
|   ID    | GROUP | SCORE |
+---------+-------+-------+
| 1000046 | XS    |  5.00 |
| 1000046 | XS    |  5.00 |
| 1000046 | XS    |  4.00 |
| 1000046 | XS    |  4.00 |
| 1000047 | XS    |  6.41 |
| 1000047 | XS    |  6.41 |
| 1000047 | XS    |  6.41 |
| 1000051 | X     |  3.00 |
| 1000051 | X     |  3.00 |
| 1000051 | X     |  3.00 |
| 1000051 | XS    |  3.75 |
| 1000051 | XS    |  3.75 |
| 1000051 | XS    |  3.75 |
+---------+-------+-------+
正如你所看到的,
XS
是某些游戏中唯一的类别,它会影响我对统计数据的理解。 因此,我想选择具有多个类别的游戏的
ID
s,如
1000051

我查看了
groupby
对象的属性
groups
,问题是元组只有两个值
('1000051','X),('1000051','XS')
,如果一个ID(游戏)包含多个组,则不提供信息,例如
('1000051','X','XS

好吧,我知道我可以做一个算法来获得一个
dict
,如下所示:

Ids_groups = {
 '1000046': ['XS'],
 '1000047': ['XS'],
 '1000051' : ['XS','X']
}
然后我只能保留
'XS'
位于值(列表)中且值长度超过1的键和值。然后使用键列表
['1000051',…]
选择数据帧中需要的行

所以我问你是否有一种更聪明的方法,一种更有效的方法

熊猫版本:0.23.4 Python版本:3.7.4使用:


此外,我们还可以使用
Groupby.transform
执行以下操作:


我会使用
nunique()
来了解每场游戏有多少组,之后您可以在筛选函数中使用它,或者只是作为额外变量来执行计算:

import pandas as pd
d = {'ID':[1,1,1,1,2,2,2,3,3],'GROUP':['XS','XS','X','XS','XS','XS','XS','XS','X'],'SCORE':[3,4,2,3,4,3,3,2,1]}
df = pd.DataFrame(d)

df_1 = df.groupby(['ID'],as_index=False).agg({'GROUP':'nunique'})
print(df_1)
输出:

   ID  GROUP
0   1      2
1   2      1
2   3      2

因此,您现在知道,对于第1场比赛,有2个小组参与,对于第2场比赛,只有1个小组参与,对于第3场比赛,也有2个小组参与。

第二个小组的速度要快得多
GroupBy.filter
使用了一个慢循环:(谢谢,我自己找不到它,尤其是当
GroupBy
对象的
transform
函数被禁用时。
print(df)

          ID GROUP  SCORE
0   1000046    XS   5.00
1   1000046    XS   5.00
2   1000046    XS   4.00
3   1000046    XS   4.00
4   1000047    XS   6.41
5   1000047    XS   6.41
6   1000047    XS   6.41
7   1000051     X   3.00
8   1000051     X   3.00
9   1000051     X   3.00
10  1000051    XS   3.75
11  1000051    XS   3.75
12  1000051    XS   3.75
import pandas as pd
d = {'ID':[1,1,1,1,2,2,2,3,3],'GROUP':['XS','XS','X','XS','XS','XS','XS','XS','X'],'SCORE':[3,4,2,3,4,3,3,2,1]}
df = pd.DataFrame(d)

df_1 = df.groupby(['ID'],as_index=False).agg({'GROUP':'nunique'})
print(df_1)
   ID  GROUP
0   1      2
1   2      1
2   3      2