Python 比较两列后的计数器增量
我想用pandas创建一个简单的计数器,每次循环完成时递增1。这应该很简单,但我想不出来。。。以下是我想做的事情,带有一个说明性的数据框: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' ==
# 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
循环来做同样的事情,但是它会变得不那么简洁,速度也会慢很多。