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