具有多列数据框,我对如何保留/获取每列第25至75个百分位数之间的数据框部分感兴趣? 我需要删除值在25-75%范围之外的行(只是时间步长)
df %>%
gather %>%
count(key,value) %>%
spread(key, n)
我希望看到的行数更少,所以我必须消除一系列与时间序列相离的度量。
这来自原始数据集,其中x轴显示行。因此,我需要通过设置百分位数标准来删除此Blob
最后,我会采用最严格的标准将其应用于整个数据框
答案 0 :(得分:2)
我不是100%确定这是您想要的,但是IIUC可以创建一个遮罩,然后将其应用于数据框。
df1[df1.apply(lambda x: x.between(x.quantile(.25), x.quantile(.75))).all(1)]
400.0 401.0 402.0 403.0
8 12.155895 14.145402 15.134910 15.130119
9 12.152373 14.144456 15.136539 15.134795
这将删除包含超出范围的任何列中任何值的任何行。
如果您只想删除包含范围之外的所有所有值的行,则可以使用:
df1[df1.apply(lambda x: x.between(x.quantile(.25), x.quantile(.75))).any(1)]
400.0 401.0 402.0 403.0
2 13.513627 13.757856 15.002085 15.146499
3 13.095409 14.223524 15.351638 15.431543
5 12.782643 13.818065 14.853486 14.874350
6 13.278548 13.300235 15.321922 14.333470
7 13.160153 13.173674 14.187195 14.192128
8 12.155895 14.145402 15.134910 15.130119
9 12.152373 14.144456 15.136539 15.134795
10 12.147820 13.142969 15.138118 15.136049
11 13.023997 13.022471 15.020945 15.019307
12 0.010729 14.010802 15.010875 15.012037
13 0.006050 14.006181 15.006313 15.006674
14 0.002356 14.002641 15.002927 15.003002
如果任何列中的任何值落在其相应列的百分位数范围内,则行将保留在此处。
答案 1 :(得分:2)
在下面的基础numpy
数组上进行操作将更快:
a = df1.values
q1 = np.quantile(a, q=0.25, axis=0)
q2 = np.quantile(a, q=0.75, axis=0)
mask = ((q1 < a) & (a < q2)).all(1)
df1[mask]
400.0 401.0 402.0 403.0
8 12.155895 14.145402 15.134910 15.130119
9 12.152373 14.144456 15.136539 15.134795
如果要排除这些行,请反转掩码(df[~mask]