Как построить ряд объектов Python-панд, атрибуты которых попадают в диапазон - PullRequest
0 голосов
/ 15 октября 2019

У меня есть pandas.Series, S, из объектов, где каждый объект, t, имеет несколько атрибутов, одним из которых является его длина, t.len. Я хочу создать еще одну серию SL, состоящую из тех объектов в S, которые имеют длину между 60-м и 90-м процентилем объектов в S. Каков наиболее эффективный способ кодирования этого?

Предположим, S = [t0, t1, t2, t3, t4, t5, t6, t7, t8, t9] это серия из 10 предметов. Список их соответствующих длин: [15, 4, 10, 20, 3, 20, 13, 8, 14, 1]. Длина 60-го процентиля равна 13,4, а длина 90-го процентиля равна 20. Тогда SL = [t0, t3, t5, t8]

Вот код, основанный на series.between, но он выдает ошибку, а именно: TypeError: индексы списка должны быть целыми числамиили ломтики, а не серии

import numpy as np
import pandas as pd

class Object:
    def __init__(self, tid, length):
        self.tid = tid        
        self.len = length

objectseries = pd.Series([Object(0, 15), Object(1, 4), Object(2, 10), Object(3, 20), Object(4, 3), Object(5, 20), Object(6, 13), Object(7, 8), Object(8, 14), Object(9, 1)])
lenseries = pd.Series(x.len for x in objectseries)
ll = np.percentile(lenseries, 60)
uu = np.percentile(lenseries, 90)
sl = lenseries.between(ll,uu)
print (sl)
objectlist = objectseries.tolist()
print (objectlist[sl])

1 Ответ

1 голос
/ 15 октября 2019

Вы можете использовать quantile для получения значений процентиля и использовать between:

df = pd.DataFrame({'object':[f't{i}' for i in range(10)],
              'values':[15, 4, 10, 20, 3, 20, 13, 8, 14, 1]})

q60,q90 = df['values'].quantile([0.6, 0.9])

df.loc[df['values'].between(q60,q90), 'object']

Вывод:

0    t0
3    t3
5    t5
8    t8
Name: object, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...