在熊猫数据框上按条件有效地增加值

Posted

技术标签:

【中文标题】在熊猫数据框上按条件有效地增加值【英文标题】:Efficiently incrementing value by condition on pandas dataframe 【发布时间】:2021-05-14 19:43:31 【问题描述】:

我有一个 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

【问题讨论】:

【参考方案1】:

看起来只是一个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

【讨论】:

以上是关于在熊猫数据框上按条件有效地增加值的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫数据框上应用正则表达式函数

如何在熊猫数据框上使用 sklearn TFIdfVectorizer

在熊猫数据框上使用 str.contains [重复]

在熊猫数据框上设置多索引的最佳方法

多索引熊猫数据框上的值错误

有效地合并熊猫中的多个数据框[重复]