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