#python #pandas #apply
#python #pandas #применить
Вопрос:
Я видел этот вопрос для R, но не для python.
В принципе, у меня есть большой фрейм данных, где я применяю функцию по строкам. Для запуска требуется очень много времени, и я надеялся поместить инструкцию print, чтобы показать, где я нахожусь. Я собрал пример того, что я хотел бы сделать.
Я знаю альтернативу, но я подумал, возможно ли это с помощью apply.
Так что это будет работать нормально
import pandas as pd
df = pd.DataFrame({0: [1,2,3], 1:[2,3,4], 2: [0,0,0]})
i = 0
for rows in df:
print ("Current row: {}".format(i))
df[2][i] = df[0][i] * df[1][i]
i = 1
print (df)
Вывод
Current row: 0
Current row: 1
Current row: 2
0 1 2
0 1 2 2
1 2 3 6
2 3 4 12
Но я надеялся сделать что-нибудь с apply, например:
def func(df):
#something here to print
return df[0] * df[1]
df[2] = df.apply(func,axis=1)
Большое спасибо.
Комментарии:
1. Вы пробовали использовать этот способ, который вы описали? Каков был результат?
2. На самом деле только что попробовал что-то с iloc, и это работает. Итак, я сделал: импортируйте pandas как pd df = pd.DataFrame({0: [1,2,3], 1:[2,3,4], 2: [0,0,0]}) функция def(df): print (df.iloc[0]) возвращает df[0] * df[1] df[2] = df.apply(функция, ось =1)
3. Почему бы вам просто не использовать df [2]=df [0] * df [1]. Есть ли конкретная причина делать это через цикл? таким образом, это будет быстрее.
4. Привет, Сэл, спасибо за твой комментарий. Это всего лишь краткий пример, но фактическая функция, для которой я хотел ее использовать, намного сложнее. Я ценю предложение в любом случае. 🙂
Ответ №1:
Я думаю, вы можете написать свою функцию следующим образом:
def func(df):
print(f'Current row: {df.name}')
return df[0] * df[1]
Использование заключается в следующем:
>>> df[2] = df.apply(func, axis=1)
Current row: 0
Current row: 1
Current row: 2
Ответ №2:
Вы можете использовать series.name
:
>>> def mul(row):
print('Current row:', row.name)
return row[0] * row[1]
>>> df[2] = df.apply(mul, axis=1);print(df)
Current row: 0
Current row: 1
Current row: 2
0 1 2
0 1 2 2
1 2 3 6
2 3 4 12