Как применить функцию ко всем строкам фрейма данных

#python #pandas #apply

#python #pandas #применить

Вопрос:

У меня есть набор данных следующим образом

 data = { "C1": [1.0 , 1.2 , 1.2,  1.30 , 1.29 , 1.30,  1.31] ,
         "C2" :[1.2 , 1.3 , 1.3 , 1.40 , 1.50 , 1.60 , 1.61] ,
         "C3": [1.3 , 1.0 , 1.2 , 1.21 , 1.31 , 1.42 , 1.33] }

data = pd.DataFrame(data)
data = data.T
print(data)


          0    1    2     3     4     5     6
Cell 1  1.0  1.2  1.2  1.30  1.29  1.30  1.31
Cell 2  1.2  1.3  1.3  1.40  1.50  1.60  1.61
Cell 3  1.3  1.0  1.2  1.21  1.31  1.42  1.33
  

У меня есть функция, которая находит неубывающие последовательности в списке чисел. Например, если вы рассматриваете первую строку, которая

 [1.0 , 1.2 , 1.2,  1.30 , 1.29 , 1.30,  1.31]
  

есть две неубывающие последовательности:

 1- [1.0 , 1.2 , 1.2,  1.30] and 2- [1.29 , 1.30,  1.31]
  

Я использую следующую функцию для получения этих неубывающих последовательностей:

 def igroups(x):
    s = [0]   [i for i in range(1, len(x)) if x[i] < x[i-1]]    [len(x)]
    #print(s)
    return [x[j:k] for j, k in [s[i:i 2] for i in range(len(s)-1)] if k - j > 1]
  

Мой вопрос: я хочу apply работать igroups со всеми строками моего фрейма данных. Как я могу это сделать?
Я попытался решить эту проблему, используя apply , например

 dt.applymap(lambda x :  igroups(x))
  

Я знаю apply , что функция работает с ячейками, а не со строкой, и причина, по которой последняя строка кода не работает, связана с этим, я также знаю, что я могу решить эту проблему с помощью циклов (чего я предпочитаю не делать).

Представляющим интерес результатом будет нечто такое, что появится новый столбец (new), содержащий список неубывающих последовательностей чисел:

 0       1    2    3    4     5     6     7     new
Cell 1  1.0  1.2  1.2  1.30  1.29  1.30  1.31  [[1.0 , 1.2 , 1.2,  1.30 ], [1.29 , 1.30,  1.31]]
Cell 2  1.2  1.3  1.3  1.40  1.50  1.60  1.61  [[1.2 , 1.3 , 1.3 , 1.40 , 1.50 , 1.60 , 1.61]]
Cell 3  1.3  1.0  1.2  1.21  1.31  1.42  1.33  [[1.0 , 1.2 , 1.21 , 1.31 , 1.42]]
            
  

Ответ №1:

Используйте pandas apply с axis = 1 . Он применит функцию к каждой строке и вернет ряд.

 df['new'] = df.apply(igroups, axis = 1)