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