我有一个pandas数据框架,我想比较Var1
和Var2
中的值
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
的单独列,只有当Var1
和Var2
之间随着时间的推移(从最早的时间戳开始)检测到变化时,该列才会增加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