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
,但是由于我对熊猫的概念非常有限,我就是不能做我想做的事情
有人有解决办法吗
谢谢
AndreaGroupBy对象具有
分位数
方法。你可以计算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