применить с помощью функции с помощью iloc pandas

#python #pandas #pandas-apply

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

Вопрос:

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

Например,

 p = {'val1': [10, 20, 30, 40],
    'val2': [15, 25, 35, 45]}

data = pd.DataFrame(p, columns=['val1', 'val2'])
data
  

У меня есть эти данные, и я выполнил следующую операцию

 inc = 100*((data.iloc[:, -1]/ data.iloc[:, -1-1])-1)
inc
  

результат

 0    50.000000
1    25.000000
2    16.666667
3    12.500000
dtype: float64
  

Я хочу выбрать максимальное значение и индекс максимального значения, я сделал следующее

 (inc.idxmax(), max(inc))
  

Я получил следующий результат

 (0, 50.0)
  

Теперь я определяю функцию

 def increase(column):
    inc = 100*((data.iloc[:, -column]/ data.iloc[:, -column-1])-1)
    return (inc.idxmax(), max(inc))
  

Я выбираю столбцы в обратном направлении.

и я хочу применить эту функцию ко всем моим столбцам

 new_data = data.apply(increase)
  

когда я использую это, я получаю сообщение об ошибке

 IndexError: positional indexers are out-of-bounds
  

и если я использую applymap, я получаю ту же ошибку

Что я могу сделать?

Комментарии:

1. замените wdi_gdp данными

2. Я не понимаю. Зачем вам нужно применять функцию увеличения, если у вас уже есть результат df: index 0 — значение: 50. Поделитесь своим ожидаемым результатом.

3. wdi_gdp — это данные. Мне нужно применить функцию, потому что в исходных данных у меня 40 столбцов, и мне нужно управлять всеми столбцами с помощью этой функции.

4. привет, 1. каков ваш ожидаемый результат всего процесса. 2. можете ли вы добавить еще один столбец, чтобы мы видели, как вы хотите ссылаться на него?

Ответ №1:

Если я правильно понимаю, вы хотите использовать несколько столбцов в функции. Применение здесь не является решением, потому что оно работает с одной строкой или столбцом (axis = 0 или 1) в данный момент.

итак, я предлагаю нам ввести 2 столбца на итерацию таким образом:

 def increase(col1,col2):
   inc = 100*((col2/ col1)-1)
   return (inc.idxmax(), max(inc))

lst = []
for i in range(len(data.columns)):
    j=i 1
    if j<len(data.columns):
        col1 = data[data.columns[i]]
        col2 = data[data.columns[j]]
        lst.append(increase(col1,col2))

pd.DataFrame(lst)
  

введите описание изображения здесь