【问题标题】:how to get 3 boolean values from dataframe [duplicate]如何从数据框中获取 3 个布尔值 [重复]
【发布时间】:2021-12-20 14:01:19
【问题描述】:

假设我有整数值 0 t0 100 的数据框。 我想将这些值分为 3 个部分,lowmidhigh,其中 low 小于 33,high 大于 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 语句以及and 和其他运算符。 low 和 high 都可以,但是 mid 不行。

请问有什么办法吗?

【问题讨论】:

  • 使用between函数:df['int'].between(33, 66)
  • 使用 between 函数:df['int'].between(33, 66)。这行得通,兄弟。感谢您的回答。我将编辑我的帖子。
  • df['mid'] = (33 &lt; df['int']) &amp; (df['int'] &lt; 66)
  • 欢迎来到 Stack Overflow。如果提供给您的答案解决了您的问题,请不要编辑问题来说明这一点。相反,请单击 accept它的答案旁边的复选标记轮廓。

标签: python pandas dataframe


【解决方案1】:

当您进入 cmets 时,您可以使用 between(33, 66)

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

但你也可以写成

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

你也可以使用(not low) and (not high)

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)

但它更像open-close 范围(在数学中(a, b]):

min < x <= 33
 33 < x <= 66
 66 < x <= max

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 2021-02-24
    • 2016-06-23
    • 2018-02-06
    • 2020-06-14
    • 1970-01-01
    相关资源
    最近更新 更多