我想在熊猫中创建一个简单的计数器,每完成一个周期,计数器就会增加一个。这应该很简单,但我无法弄清楚...这是我想做的,并带有一个说明性的熊猫DataFrame:
# 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做到这一点,我会很高兴。本质上,我遍历了DataFrame中的每条记录/行,并比较了两列。
我知道我可以用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)
答案 0 :(得分:2)
您可以通过实现自己的目标
df['c'] = ((df['a'] == 1) & (df['b'] == 0)).cumsum()
答案 1 :(得分:0)
我看到了其他答案,但没有人提到使用 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)
这有帮助吗?