在pandas数据框架上有效地按条件递增值



我有一个pandas数据框架,我想比较Var1Var2中的值

import pandas as pd 

data = [['foo', 'foo', 1613030200], 
['foo', 'foo', 1613030300], ['foo', 'bar', 1613030400], 
['foo', 'foo', 1613030500], ['foo', 'foo', 1613030600], ['bar', 'foo', 1613030700],
['foo', 'foo', 1613030800], ['foo', 'foo', 1613030900], ['foo', 'foo', 1613030985]] 

df = pd.DataFrame(data, columns = ['Var1', 'Var2', 'ts']) 

df

这个想法是添加一个名为group的单独列,只有当Var1Var2之间随着时间的推移(从最早的时间戳开始)检测到变化时,该列才会增加1。

输出看起来像这样:

Var1    Var2    ts  group
0   foo foo 1613030200  0
1   foo foo 1613030300  0
2   foo bar 1613030400  1
3   foo foo 1613030500  1
4   foo foo 1613030600  1
5   bar foo 1613030700  2
6   foo foo 1613030800  2
7   foo foo 1613030900  2
8   foo foo 1613030985  2

我已经尝试使用lambda函数来增加,但这会抛出一个错误:

counter = 0
df[['Var1','Var2']].apply(lambda x: counter +=1 if x['Var1']!=x['Var2'] else counter, axis=1)

是否有一种有效的方法通过检查python中的多个列(没有for循环)的条件来增加行?在SQL中,可以使用窗口函数来完成等效的操作,例如:

SUM(
CASE WHEN Var1 <> Var2 THEN 1 ELSE 0 END
) OVER (ORDER BY ts) AS group

看起来就像一个cumsum:

df['groups'] = df['Var1'].ne(df['Var2']).cumsum()

输出:

Var1 Var2          ts  groups
0  foo  foo  1613030200       0
1  foo  foo  1613030300       0
2  foo  bar  1613030400       1
3  foo  foo  1613030500       1
4  foo  foo  1613030600       1
5  bar  foo  1613030700       2
6  foo  foo  1613030800       2
7  foo  foo  1613030900       2
8  foo  foo  1613030985       2

相关内容

  • 没有找到相关文章

最新更新