pandas根据两个条件设置列值[重复]

Posted

技术标签:

【中文标题】pandas根据两个条件设置列值[重复]【英文标题】:pandas set column value based on two conditions [duplicate] 【发布时间】:2018-06-21 08:45:51 【问题描述】:

我有一个熊猫数据框。如果 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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于pandas根据两个条件设置列值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:如果条件[重复],则从另一列更新列值

Pandas:根据搜索行查找列值[重复]

遍历 pandas 行并根据其他列中的值设置列值

根据列值删除Python Pandas中的DataFrame行[重复]

根据条件 pandas 删除 DataFrame 中的重复行

Python/Pandas - 按列值删除重复行