首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何基于其他两列创建新的dataframe列?

如何基于其他两列创建新的dataframe列?
EN

Stack Overflow用户
提问于 2022-01-21 15:39:45
回答 3查看 332关注 0票数 0

我想要创建一个二进制列,如果下表中的两个列的值都在相同的范围内,则指示1。例如,如果cat_1上的值在5-10之间,而cat_2中的值也在5-10之间,那么它应该指示1,否则应该是0。

代码语言:javascript
运行
复制
| cat_1.   | cat_2.         | [5-10] (new column to be created|
| -------- | -------------- | --------------------------------|
| 5        | 10             |1.                               |
| 7        | 9.             |1                                |
| 1        | 7.             |0                                |

到目前为止,我尝试了以下代码,但它返回了一个错误:

代码语言:javascript
运行
复制
df.loc[((df['cat_1l'] >= 5 & df['cat_1'] <= 10) 
       & (df['cat_2'] >= 5 & result['cat_2'] <= 10)), '[5-10]' = 1

这是一个错误:

代码语言:javascript
运行
复制
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-01-21 15:51:24

出现错误的原因是,&的计算比>=具有优先级。若要修复代码段,请在列比较周围添加括号:

代码语言:javascript
运行
复制
df.loc[((df['cat_1l'] >= 5) & (df['cat_1'] <= 10) 
       & (df['cat_2'] >= 5) & (result['cat_2'] <= 10)), '[5-10]' = 1

更好的是,我们倾向于将新列定义为一个整体,而不使用.loc进行子设置。例如考虑:

代码语言:javascript
运行
复制
df['[5-10]'] = df['cat1'].between(5, 10) & df['cat_2'].between(5, 10)
票数 1
EN

Stack Overflow用户

发布于 2022-01-21 15:50:08

熊猫使用按位操作(& x),每个条件都应该用圆括号括起来,否则错误就会产生。

尝试用()之类的(df['cat_1l'] >= 5) & (...)包装每个条件,以查看错误是否消失。

但是,可以使用between函数简化您的操作。

代码语言:javascript
运行
复制
df['[5-10]'] = (df.cat_1.between(5, 10) & df.cat_2.between(5, 10)).astype(int)
票数 3
EN

Stack Overflow用户

发布于 2022-01-21 15:46:20

在这种情况下,您还可以使用apply()根据其他列创建一个新列。

在这里,我传递了两个列cat_1和cat_2的值,以创建一个新列,如下所示:

代码语言:javascript
运行
复制
import pandas as pd

df = pd.DataFrame(
    {
        'cat_1': [5, 7, 1],
        'cat_2': [10, 9, 7],
    }
)


def check_in_range(x):
    cat_1, cat_2 = x
    start = 5
    end = 10
    if (start <= cat_1 <= end) and (start <= cat_2 <= end):
        return 1
    else:
        return 0

df['new'] = df[['cat_1', 'cat_2']].apply(check_in_range, axis=1)

print(df)
#   cat_1  cat_2  new
#0      5     10    1
#1      7      9    1
#2      1      7    0
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70803884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档