我不确定这是一个bug还是一个特性,但我真的想了解它是如何工作的。
我有一个非常简单的数据集
In [0]: data
Out[0]:
group value data
0 A 1 1
1 A 2 1
2 B 3 1
3 B 4 1然后我进行了一些转换:
In [1]: data.groupby('group').transform('rank')
Out[1]:
value data
0 1.0 1.5
1 2.0 1.5
2 1.0 1.5
3 2.0 1.5
In [2]: data.groupby('group').value.transform('rank')
Out[2]:
0 1
1 1
2 2
3 2
In [3]: data.groupby('group').data.transform('rank')
Out[3]:
0 1.5
1 1.5
2 1.5
3 1.5
In [4]: data.groupby('group').transform('rank').value
Out[4]:
0 1.0
1 2.0
2 1.0
3 2.0
In [5]: data.groupby('group').value.rank()
Out[5]:
0 1.0
1 2.0
2 1.0
3 2.0
In [6]: data.groupby('group').cumcount()
Out[6]:
0 0
1 1
2 0
3 1我觉得奇怪的是:
value列发生了什么(类似于第5和第6列),但我无法理解data列发生了什么。1.5值从何而来?如果有人能给我解释一下,我会非常感激的。
谢谢。
发布于 2016-11-04 12:41:53
让我再加上一点混乱- 职级()方法有一个method参数.
默认值:method='average'
In [70]: data.groupby('group').transform('rank')
Out[70]:
value data
0 1.0 1.5
1 2.0 1.5
2 1.0 1.5
3 2.0 1.5
In [71]: data.groupby('group').transform('rank', method='average')
Out[71]:
value data
0 1.0 1.5
1 2.0 1.5
2 1.0 1.5
3 2.0 1.5方法:min
In [72]: data.groupby('group').transform('rank', method='min')
Out[72]:
value data
0 1.0 1.0
1 2.0 1.0
2 1.0 1.0
3 2.0 1.0方法:max
In [73]: data.groupby('group').transform('rank', method='max')
Out[73]:
value data
0 1.0 2.0
1 2.0 2.0
2 1.0 2.0
3 2.0 2.0方法:first
In [74]: data.groupby('group').transform('rank', method='first')
Out[74]:
value data
0 1.0 1.0
1 2.0 2.0
2 1.0 1.0
3 2.0 2.0方法:dense
In [75]: data.groupby('group').transform('rank', method='dense')
Out[75]:
value data
0 1.0 1.0
1 2.0 1.0
2 1.0 1.0
3 2.0 1.0来自文档
方法:{
average,min,max,first,dense} 平均:群的平均等级 民:小组中的最低级别 群中最高级别 第一:按在数组中出现的顺序分配等级 密集:像‘min’一样,但是等级总是在组间增加1。
还有另一个参数:
pct:布尔值,默认为False 计算数据的百分比等级
发布于 2019-11-20 04:51:34
在后来版本的熊猫(我的是0.24.2)中,data.groupby('group').transform('rank')和data.groupby('group').value.transform('rank')的表现如下:
In [1]: data.groupby('group').transform('rank')
Out[1]:
value data
0 1.0 1.5
1 1.0 1.5
2 2.0 1.5
3 2.0 1.5
In [2]: data.groupby('group').value.transform('rank')
Out[2]:
0 1
1 1
2 2
3 2回答你的问题:
method of rank() func是average,因此,数据列获得等级1.5 (min=1、max=2、average=1.5)。data.groupby('group').transform('rank').value和data.groupby('group').value.transform('rank')一样返回。我建议不要同时使用transform()和rank(),transform()正是您应该使用的。如果您查看源代码 of rank()函数。它已经实现了对整个列的transform():广播的逻辑。如果您最终使用了transform('rank'),那么rank函数仍然会完成它的工作,但是transform会出错。下面是源代码的简化版本:
将熊猫作为pd导入pandas.core.algorithms作为算法g= data.groupby('group')结果= getattr(g,‘g.rank’)()#与g.rank() in = g.grouper.group_info #数组( 0,0,1,1)输出= [] for i,_in枚举(result.columns):res = algorithms.take_1d(result.iloc: i.values,ids) output.append(res) #[数组(1,1,2,2),数组( 1.5,1.5,1.5,1.5)] pd.DataFrame._from_arrays(输出,columns=result.columns,index=g.obj.index) #值_\_#值_(_cumcount()从0开始到那个组的长度- 1,rank()从1开始到n。希望这能有所帮助。
https://stackoverflow.com/questions/40421875
复制相似问题