【问题标题】:pandas set column value based on two conditions [duplicate]pandas根据两个条件设置列值[重复]
【发布时间】:2023-03-27 10:23:01
【问题描述】:

我有一个熊猫数据框。如果 x 的先前值小于 50 并且当前值大于 50,我想为新列 y 添加一个值为 1 的新列。

我收到此错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

代码:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(40,60,size=(10, 1)), columns=['x'])

df['y'] = 1 if (df['x'].shift(1) < 50) and (df['x'] > 50) else 0

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    这是一个古老的故事。 pandas 为您提供了按位运算符的重载版本,您应该将其用于矢量化 OR/AND 运算。无论如何,根据您的代码,astype 转换在这里更合适。

    In [139]: df['y'] = ((df['x'].shift(1) < 50) & (df['x'] > 50)).astype(np.int8)
    
    In [140]: df
    Out[140]:
        x  y
    0  51  0
    1  51  0
    2  48  0
    3  54  1
    4  47  0
    5  41  0
    6  51  1
    7  49  0
    8  53  1
    9  41  0
    

    或不太常见的选项:

    In [146]: df.eval("(x.shift() < 50 and x > 50) * 1", inplace=False, engine='python')
    Out[146]:
    0    0
    1    0
    2    0
    3    1
    4    0
    5    0
    6    1
    7    0
    8    1
    9    0
    Name: x, dtype: int32
    

    【讨论】:

    • 抱歉,票数已满。但请接受我的解释!
    • @cᴏʟᴅsᴘᴇᴇᴅ,谢谢! :)
    【解决方案2】:

    and 是 Python 类不能覆盖的运算符。它将两个表达式作为输入。它评估第一个。如果第一个的真实性是True,那么它评估后者并返回该结果。如果thruthiness为False,则返回前一个表达式的结果。

    这里可以使用布尔运算符&amp;(逻辑与)和|(逻辑或)。我们可以将其重写为:

    df['y'] = ((df['x'].shift(1) < 50) & (df['x'] > 50)).astype(int)
    

    这里我们使用astypebooleans 行转换为整数行。 False 映射到 0True 映射到 1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-11
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2018-01-20
      • 2020-04-09
      • 2020-07-08
      • 1970-01-01
      相关资源
      最近更新 更多