Как напечатать текущий номер строки при использовании .apply в DataFrame

#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