我想要创建一个二进制列,如果下表中的两个列的值都在相同的范围内,则指示1。例如,如果cat_1上的值在5-10之间,而cat_2中的值也在5-10之间,那么它应该指示1,否则应该是0。
| cat_1. | cat_2. | [5-10] (new column to be created|
| -------- | -------------- | --------------------------------|
| 5 | 10 |1. |
| 7 | 9. |1 |
| 1 | 7. |0 |
到目前为止,我尝试了以下代码,但它返回了一个错误:
df.loc[((df['cat_1l'] >= 5 & df['cat_1'] <= 10)
& (df['cat_2'] >= 5 & result['cat_2'] <= 10)), '[5-10]' = 1
这是一个错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
发布于 2022-01-21 15:51:24
出现错误的原因是,&
的计算比>=
具有优先级。若要修复代码段,请在列比较周围添加括号:
df.loc[((df['cat_1l'] >= 5) & (df['cat_1'] <= 10)
& (df['cat_2'] >= 5) & (result['cat_2'] <= 10)), '[5-10]' = 1
更好的是,我们倾向于将新列定义为一个整体,而不使用.loc
进行子设置。例如考虑:
df['[5-10]'] = df['cat1'].between(5, 10) & df['cat_2'].between(5, 10)
发布于 2022-01-21 15:50:08
熊猫使用按位操作(& x),每个条件都应该用圆括号括起来,否则错误就会产生。
尝试用()之类的(df['cat_1l'] >= 5) & (...)
包装每个条件,以查看错误是否消失。
但是,可以使用between
函数简化您的操作。
df['[5-10]'] = (df.cat_1.between(5, 10) & df.cat_2.between(5, 10)).astype(int)
发布于 2022-01-21 15:46:20
在这种情况下,您还可以使用apply()
根据其他列创建一个新列。
在这里,我传递了两个列cat_1和cat_2的值,以创建一个新列,如下所示:
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
https://stackoverflow.com/questions/70803884
复制相似问题