Применить функцию к каждой строке фрейма данных и одновременно увеличить счетчик

#python #pandas #dataframe

#python #pandas #фрейм данных #применить

Вопрос:

Я знаю, что могу использовать apply() для применения функции к каждой строке фрейма данных, как показано ниже:

 import pandas as pd
df = pd.DataFrame({'Name' : ['A', 'B', 'C'], 'Number' : [1,2,3]})
def func(row):
    pass
df.apply(lambda x: func(x), axis =1 )

  

Но мне нужно передать инкрементный счетчик func() . Что-то вроде приведенного ниже, но я не знаю, как увеличить счетчик!

 import pandas as pd
df = pd.DataFrame({'Name' : ['A', 'B', 'C'], 'Number' : [1,2,3]})
def func(row, counter):
    pass
counter = 0 #initial value
df.apply(lambda x: func(x, counter), axis =1 )

  

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

1. Существуют такие функции, как cumcount, cumsum и т. Д., Которые могут помочь вам делать то, что вы хотите (неясно, чего вы на самом деле хотите)

2. В этой ситуации я использую глобальный var

Ответ №1:

В Python функции являются гражданами первого класса, даже те, которые принадлежат объектам, один из способов добиться желаемого заключается в следующем:

 import pandas as pd

df = pd.DataFrame({'Name': ['A', 'B', 'C'], 'Number': [1, 2, 3]})


class Counter:

    def __init__(self, seed):
        self.counter = seed

    def fun(self, n):
        if True:  # if you need to check a condition
            self.counter  = 1  # add any value you see fit
        return n   self.counter


counter = Counter(0)

result = df["Number"].apply(counter.fun)
print(result)
  

Вывод

 0    2
1    4
2    6
Name: Number, dtype: int64
  

Обратите внимание, что гражданство первого класса означает, что вам не нужно создавать лямбда-выражение, вы можете передать саму функцию.

Ответ №2:

Используйте глобальный var

 counter = 0 #initial value
def func(row):
    global counter
    counter =1 
    pass

df.apply(lambda x: func(x), axis =1 )
print(counter)