Python 熊猫:分组,然后检索IQR

Python 熊猫:分组,然后检索IQR,python,pandas,dataframe,pandas-groupby,quantile,Python,Pandas,Dataframe,Pandas Groupby,Quantile,我对熊猫很陌生,我正在尝试做以下事情: 我有两个数据帧comm和arts,它们看起来像这样(除了它们与其他列的广告长度更长) 通讯: ID commScore 10 5 10 3 10 -1 11 0 11 2 12 9 13

我对熊猫很陌生,我正在尝试做以下事情:

我有两个数据帧
comm
arts
,它们看起来像这样(除了它们与其他列的广告长度更长)

通讯:

ID    commScore           
10       5                
10       3                  
10      -1                 
11       0                
11       2              
12       9      
13      -2     
13      -1     
13       1      
13       4
艺术:

我需要按ID对通信进行分组,然后将每个ID的通信分数分布的四分位间距(IQR)保存在
arts
(显然在正确的ID行中)

我已经尝试过使用
groupby
agg
map
,但是由于我对熊猫的概念非常有限,我就是不能做我想做的事情

有人有解决办法吗

谢谢


Andrea

GroupBy对象具有
分位数
方法。你可以计算Q3和Q1,然后减去它们。以下是一些重命名和加入:

grouper=comms.groupby(“ID”)
q1,q3=石斑鱼分位数(0.25),石斑鱼分位数(0.75)
iqr=q3-q1
iqr=iqr.rename(列={“commScore”:“iqr”})
arts=arts.set_索引(“ID”).join(iqr)
得到

>>> arts

    commNumber  IQR
ID
10           3  3.0
11           2  1.0
12           1  0.0
13           4  3.0
如果有多个数字列,那么我们将明确说明
commScore
如下:

grouper=comms.groupby(“ID”).commScore
q1,q3=石斑鱼分位数(0.25),石斑鱼分位数(0.75)
iqr=q3-q1
iqr.name=“iqr”#`iqr`将是一个系列,因为我们选择了1列,
#所以重命名有点不同
arts=arts.set_索引(“ID”).join(iqr)
这给出了相同的结果

如果不想调用
分位数
两次,可以传递一个列表
[0.75,0.25]
,然后用
agg
减去它们。因此,我们写的不是上面涉及
q1
q3
的两行代码

iqr=grouper.quantile([0.75,0.25]).groupby(“ID”).agg(np.subtract.reduce)

其余的都是一样的。

我们可以通过
ID
对数据帧进行分组,并使用
scipy.stats
中的函数来计算四分位间距,然后
map
arts
数据帧的
ID
列上计算该
iqr
范围

from scipy.stats import iqr

arts['IQR'] = arts['ID'].map(comms.groupby('ID')['commScore'].agg(iqr))


谢谢你的回答。但是python如何理解我想要计算代码第2行中
commScore
变量的分位数呢?@Sala它适用于按ID分组后剩下的所有数值列。在本例中,只有
commScore
。实际上我有多个数字列没有报告here@Sala如果有帮助的话,我编辑了它来解释。谢谢你的详细答案!从现在起,我将努力做到这一点。干杯,谢谢你,Shubham。
from scipy.stats import iqr

arts['IQR'] = arts['ID'].map(comms.groupby('ID')['commScore'].agg(iqr))
   ID  commNumber  IQR
0  10           3    3
1  11           2    1
2  12           1    0
3  13           4    3