pandas 对 Dataframe 的每一行应用函数,同时增加计数器

qmelpv7a  于 2022-12-02  发布在  其他
关注(0)|答案(2)|浏览(180)

我知道我可以使用apply()对 Dataframe 的每一行应用函数,如下所示:

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

i7uaboj41#

在Python中,functions are first class citizens,甚至是属于对象的functions are first class citizens,一种实现所需的方法如下:

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

注意,一级公民身份意味着你不需要创建lambda,你可以传递函数本身。

hec6srdp

hec6srdp2#

使用全局变量

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

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

相关问题