определите диапазон в столбце панды на основе определения входных данных из списка

#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’