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
,则返回前一个表达式的结果。
这里可以使用布尔运算符&
(逻辑与)和|
(逻辑或)。我们可以将其重写为:
df['y'] = ((df['x'].shift(1) < 50) & (df['x'] > 50)).astype(int)
这里我们使用astype
将booleans 行转换为整数行。 False
映射到 0
和 True
映射到 1
。
【讨论】:
以上是关于pandas根据两个条件设置列值[重复]的主要内容,如果未能解决你的问题,请参考以下文章
根据列值删除Python Pandas中的DataFrame行[重复]