根据条件对数据框中的正负连续元素进行计数

时间:2018-12-19 21:45:00

标签: python pandas numpy

我有一个这样的数据框。

import pandas as pd

df = pd.DataFrame({
    'col': ['neutral', 'neutral', 'neutral', 'positive', 'positive', 'negative', 'neutral']})

现在,我想更新“ col”,以便当从正值变为负值或反之亦然时得到true,否则得到false(即,连续相等的值),而在发生变化时得到false从正/负到中性,反之亦然。

我用grouby和transform尝试了几种方法,但是没有用。

我想要的输出将是:

df = pd.DataFrame({
    'col': ['False', 'False', 'False', 'False', 'False', 'True', 'False']})  

2 个答案:

答案 0 :(得分:1)

map + diff

分别将正负映射到1-1,将中立映射到0。当采用级数差时,每次正负跟随时输出的绝对值将为2,您可以轻松检查该值,以得到所需的结果:

d = {'positive': 1, 'negative': -1, 'neutral': 0}

df.col.map(d).diff().abs().eq(2)

0    False
1    False
2    False
3    False
4    False
5     True
6    False
Name: col, dtype: bool

答案 1 :(得分:0)

一个长表达式,它根据您的条件生成布尔值:

(((df['col'] == 'positive') & (df['col'].shift(1) == 'negative')) | ((df['col'] == 'negative') & (df['col'].shift(1) == 'positive')))

这将使用按位运算符来说明当前位置是否为正,而后一个位置为负,真或当前位置是否为负,以下为正,否则返回false。

>>> (((df['col'] == 'positive') & (df['col'].shift(1) == 'negative')) | ((df['col'] == 'negative') & (df['col'].shift(1) == 'positive')))
0    False
1    False
2    False
3    False
4    False
5     True
6    False
Name: col, dtype: bool

必须同时满足两个第一个条件才能返回true,或者必须同时满足两个第二个条件才能返回true。