比较两列后的熊猫计数器增量

时间:2018-12-15 20:10:44

标签: python pandas apply

我想在熊猫中创建一个简单的计数器,每完成一个周期,计数器就会增加一个。这应该很简单,但我无法弄清楚...这是我想做的,并带有一个说明性的熊猫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)

2 个答案:

答案 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)

这有帮助吗?