我有一个这样的数据框。
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']})
答案 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。