在熊猫数据框上按条件有效地增加值
Posted
技术标签:
【中文标题】在熊猫数据框上按条件有效地增加值【英文标题】:Efficiently incrementing value by condition on pandas dataframe 【发布时间】:2021-05-14 19:43:31 【问题描述】:我有一个 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
【问题讨论】:
【参考方案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
【讨论】:
以上是关于在熊猫数据框上按条件有效地增加值的主要内容,如果未能解决你的问题,请参考以下文章