我对潘达斯很陌生,我正努力做以下事情:
我有两个数据格式comms和arts,它们看起来像这样(除了与其他列相比,它们的广告更长)。
通讯:
ID commScore
10 5
10 3
10 -1
11 0
11 2
12 9
13 -2
13 -1
13 1
13 4艺术:
ID commNumber
10 3
11 2
12 1
13 4 我需要按ID对comms进行分组,然后在arts中(显然在正确的ID行中)保存每个ID的commScore发行版的四分位数范围(IQR)。
我已经尝试过使用groupby、agg和map,但是由于我对pandas的概念非常有限,所以我无法做我想要的事情。
有人有解决办法吗?
谢谢
安德里亚
发布于 2021-04-22 14:51:30
我们可以通过group和聚合列commScore来计算ID和聚合列commScore的数据,使用scipy.stats函数iqr计算四分位数范围,然后在arts数据帧的列ID上计算出计算的iqr范围。
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发布于 2021-04-22 14:48:04
GroupBy对象有一个quantile方法。您可以计算Q3和Q1,并减去它们。一些重命名和加入的人跟随它:
grouper = comms.groupby("ID")
q1, q3 = grouper.quantile(0.25), grouper.quantile(0.75)
iqr = q3 - q1
iqr = iqr.rename(columns={"commScore": "IQR"})
arts = arts.set_index("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 = grouper.quantile(0.25), grouper.quantile(0.75)
iqr = q3 - q1
iqr.name = "IQR" # `iqr` will be a series since we selected 1 column,
# so renaming is a bit different
arts = arts.set_index("ID").join(iqr)结果是一样的。
如果不想调用quantile 2次,可以传递一个列表[0.75, 0.25],然后用agg减去它们。因此,我们不需要上面涉及q1和q3的两行代码,而是编写
iqr = grouper.quantile([0.75, 0.25]).groupby("ID").agg(np.subtract.reduce)其余的都一样。
https://stackoverflow.com/questions/67214703
复制相似问题