#python-3.x #pandas #list #function
Вопрос:
У меня есть один фрейм данных, в котором мне нужно применить диапазон в одном столбце на основе предоставленного списка, я могу добиться результатов, используя фиксированные значения, но входные значения будут динамическими в формате списка, а диапазон будет основан на вводе.
Мой фрейм данных выглядит следующим образом:
import pandas as pd rangelist=[90,70,50] data = {'Result': [75,85,95,45,76,8,10,44,22,65,35,67]} sampledf=pd.DataFrame(data)
список диапазонов-это мой список, из которого мне нужно создать диапазон 100-90,90-70 и 70-50. Эти диапазоны могут время от времени отличаться, до сих пор я добиваюсь результатов, используя приведенную ниже функцию.
def cat(value): cat='' if (valuegt;90): cat='90-100' if (valuelt;90 and valuegt;70 ): cat='90-70' else: cat='lt; 50' return cat sampledf['category']=sampledf['Result'].apply(cat)
Как я могу передать динамическое значение в функции»cat» на основе списка диапазонов? Я буду благодарен, если кто-нибудь сможет помочь мне достичь нижеприведенного результата.
Result category 0 75 90-70 1 85 90-70 2 95 lt; 50 3 45 lt; 50 4 76 90-70 5 8 lt; 50 6 10 lt; 50 7 44 lt; 50 8 22 lt; 50 9 65 lt; 50 10 35 lt; 50 11 67 lt; 50
Ответ №1:
Я бы рекомендовал pd.cut
для этого:
sampledf['Category'] = pd.cut(sampledf['Result'], [-np.inf] sorted(rangelist) [np.inf])
Выход:
Result Category 0 75 (70.0, 90.0] 1 85 (70.0, 90.0] 2 95 (90.0, inf] 3 45 (-inf, 50.0] 4 76 (70.0, 90.0] 5 8 (-inf, 50.0] 6 10 (-inf, 50.0] 7 44 (-inf, 50.0] 8 22 (-inf, 50.0] 9 65 (50.0, 70.0] 10 35 (-inf, 50.0] 11 67 (50.0, 70.0]
Комментарии:
1. Спасибо за потраченное время , но ответ дает ошибку типа: ufunc «isfinite»не поддерживается для типов ввода, и входные данные не могут быть безопасно привязаны к любым поддерживаемым типам в соответствии с правилом приведения «безопасно».
Ответ №2:
import numpy as np breaks = pd.Series([100, 90, 75, 50, 45, 20, 0]) sampledf["ind"] = sampledf.Result.apply(lambda x: np.where(x gt;= breaks)[0][0]) sampledf["category"] = sampledf.ind.apply(lambda i: (breaks[i], breaks[i-1])) sampledf # Result ind category # 0 75 2 (75, 90) # 1 85 2 (75, 90) # 2 95 1 (90, 100) # 3 45 4 (45, 50) # 4 76 2 (75, 90) # 5 8 6 (0, 20) # 6 10 6 (0, 20) # 7 44 5 (20, 45) # 8 22 5 (20, 45) # 9 65 3 (50, 75) # 10 35 5 (20, 45) # 11 67 3 (50, 75)
Комментарии:
1. Спасибо за потраченное время, этот код выдает ошибку типа: ‘gt;=’ не поддерживается между экземплярами ‘int’ и ‘list’