当前位置: 首页 > 知识库问答 >
问题:

如何从dataframe[duplicate]获取3个布尔值

阎慈
2023-03-14

假设我有整数0到100的数据帧。我想把这些值分为3部分,低、中、高,低小于33,高大于66,中介于33和66之间。所以我用

df['low'] = df['int'] <= 33
df['mid'] = 33  < df['int'] < 66
df['high'] = df['int'] >= 66 

我得到了一个错误

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_12080/1299746928.py in <module>
      1 df['low'] = df['int'] <= 33
----> 2 df['mid'] = 33  < df['int'] < 66
      3 df['high'] = df['int'] >= 66

c:\program files\python37\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
   1536     def __nonzero__(self):
   1537         raise ValueError(
-> 1538             f"The truth value of a {type(self).__name__} is ambiguous. "
   1539             "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
   1540         )

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

我已经尝试过if-else语句和以及其他操作符。低和高起作用,但中间不起作用。

请问我能知道附近的路吗?

共有1个答案

汝臻
2023-03-14

当你收到评论时,你可以在(33,66)

df['mid'] = df['int'].between(33, 66)

但你也可以把它写成

df['mid'] = (33 < df['int']) & (df['int'] < 66)

您还可以使用(不低)和(不高)

df['mid'] = ~df['low'] & ~df['high']

最小工作示例

import pandas as pd

data = {
    'int': range(0, 100, 10), 
}

df = pd.DataFrame(data)
 
df['low'] = df['int'] <= 33
df['high'] = df['int'] >= 66

df['mid1'] = (33 < df['int']) & (df['int'] < 66)

df['mid2'] = ~df['low'] & ~df['high']

df['mid-between'] = df['int'].between(33, 66)

print(df)

结果:

   int    low   high   mid1   mid2  mid-between
0    0   True  False  False  False        False
1   10   True  False  False  False        False
2   20   True  False  False  False        False
3   30   True  False  False  False        False
4   40  False  False   True   True         True
5   50  False  False   True   True         True
6   60  False  False   True   True         True
7   70  False   True  False  False        False
8   80  False   True  False  False        False
9   90  False   True  False  False        False

顺便说一句:

如果你使用pandas.cut()

bins =  pd.cut(df['int'], [-1, 33, 66, 100], labels=['low', 'mid', 'high']) 

print( bins )

然后你就可以

0     low
1     low
2     low
3     low
4     mid
5     mid
6     mid
7    high
8    high
9    high
import pandas as pd

data = {
    'int': range(0, 100, 10), 
}

df = pd.DataFrame(data)

min_value = min(df['int']) - 1
max_value = max(df['int']) + 1

bins = pd.cut(df['int'], [min_value, 33, 66, max_value], labels=['low', 'mid', 'high'])

print(bins)

但它更像是开闭范围(在数学中(a,b)):

min < x <= 33
 33 < x <= 66
 66 < x <= max
 类似资料:
  • 我正在使用CodeIgniter 3和PostgreSQL 9.4数据库。如果数据库中相应列的数据类型是布尔值,有没有办法在PHP中获取布尔值? 我使用CodeIgniters查询生成器类,如下所示: 用户表中的所有布尔值都由字符串('t'和'f')表示。

  • 问题内容: Go的布尔类型的零值为。Postgres支持未定义的BOOL类型,表示为NULL。尝试从Go中的Postgres获取BOOL值时,这会导致问题: 输出: 解决这个问题的最惯用的方法是什么?我想象的两种解决方案都不是很吸引人: 不要使用Go的类型。相反,我可能会使用一个字符串,并进行自己的转换,这占 在Postgres中,请始终通过使用或其他方式确保BOOL为TRUE或FALSE 。 问

  • 如何用Java解析JSON文件中的数据?

  • 我有我的科特林班 以下是我获得价值的方式 但问题是,我没有任何问题地获得了字段的价值。但是 布尔字段始终保持 null。我已经用一些其他布尔前缀,这很好。当我使用 或 时,我没有得到布尔值。任何人都可以解释我为什么我面临这个问题。#AskFirebase

  • 我有一个DataFrame,它由单个列和单个条目组成。有没有比以下更直接的方法来获取该单个值: