Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较两列后的计数器增量_Python_Pandas_Apply - Fatal编程技术网

Python 比较两列后的计数器增量

Python 比较两列后的计数器增量,python,pandas,apply,Python,Pandas,Apply,我想用pandas创建一个简单的计数器,每次循环完成时递增1。这应该很简单,但我想不出来。。。以下是我想做的事情,带有一个说明性的数据框: # Illustrative dataframe df = pd.DataFrame({'a':[0,0,1,1,0,0,1,1], 'b':[0,1,1,0,0,1,1,0]}) # Initialize counter to zero counter = 0 # Increment the counter by 1 every time 'a' ==

我想用pandas创建一个简单的计数器,每次循环完成时递增1。这应该很简单,但我想不出来。。。以下是我想做的事情,带有一个说明性的数据框:

# Illustrative dataframe
df = pd.DataFrame({'a':[0,0,1,1,0,0,1,1], 'b':[0,1,1,0,0,1,1,0]})

# Initialize counter to zero
counter = 0

# Increment the counter by 1 every time 'a' == 1 and 'b' == 0
df['c'] = [counter += 1 if (df['a'] == 1) and (df['b'] == 0)]
如果有人告诉我如何使用pandas.apply,使用自定义函数,我会很高兴。基本上,我在数据帧中的每个记录/行上循环,并比较两列

我知道我可能可以用numpy.where()来做,然后做一个扩展求和,但我确实在尝试学习如何将apply与自定义函数一起使用

下面是我尝试过的另一种方法,使用自定义函数和pandas.apply:

counter_list = []
counter = 0
def count_cycles(df):
    if (df['a'] == 1) and (df['b'] == 0):
        counter += 1
    counter_list.append(counter)
    return pd.Series(counter_list)
df['c'] = df.apply(count_cycles)

你可以通过以下方式实现你想要的

df['c'] = ((df['a'] == 1) & (df['b'] == 0)).cumsum()

我看到了其他答案,没有人提到使用
global
关键字访问全局变量,也可以使用Pandas Dataframe的Apply函数:

counter_list = []
counter = 0

def count_cycles(df):

    global counter  # <-- HERE
    if (df['a'] == 1) and (df['b'] == 0):
        counter += 1
    counter_list.append(counter)
    return pd.Series(counter_list)

df['c'] = df.apply(count_cycles)
计数器列表=[]
计数器=0
def计数_循环(df):

全局计数器#是否
(df.a.eq(1)和df.b.eq(0)).cumsum()提供所需的输出?是的,这正是我想要的输出。有人能告诉我如何使用自定义函数和pandas.apply做同样的事情吗?我也需要学习。谢谢!是的,这正是我想要的输出。有人能告诉我如何使用自定义函数和pandas.apply做同样的事情吗?我也需要学习。谢谢!使用
apply
恐怕不可能,因为它既不支持要引用的全局状态的概念(例如计数器的当前值),也无法访问前一行的值。您可以使用
for
循环来做同样的事情,但是它会变得不那么简洁,速度也会慢很多。