首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用if/else语句创建一个新的变量数值列

使用if/else语句创建一个新的变量数值列
EN

Stack Overflow用户
提问于 2015-11-23 09:13:47
回答 1查看 4.9K关注 0票数 2

我有一个包含列'y‘的数据集,其中存在一个特定的值。我想取该列,并创建一个新的列(z),表示如果y值为47472,那么z应该是1000,如果y <1000,则z=y*2,否则所有其他值都应该是2000。下面是一个模拟数据示例。我没有“z”列,但我想创建它:

代码语言:javascript
复制
          y      z
0      1751   2000
1       800   1600
2     10000   2000
3       350    700
4       750   1500
5      1750   3500
6     30000   2000
7     47472   1000


def test(y):
    if y == 47472:
        z=1000
    elif y < 1000:
        z=y*2
    else:
        z=2000
    return Z

# I tried to call the above function below
z = test(y)
z

但是我没有得到结果,相反,它显示了下面的错误:

ValueError:系列的真值是不明确的。使用a.empty、a.bool()、a.item()、a.any()或a.all()。

EN

回答 1

Stack Overflow用户

发布于 2015-11-23 11:02:28

问题是在if语句中使用的是Series,例如:

代码语言:javascript
复制
if y == 47472:

假设y是DataFrame的一部分,这将产生一个布尔列表:

代码语言:javascript
复制
>>> df['y']==47472
0    False
1    False
2    False
3    False
4    False
5    False
6    False
7     True
Name: y, dtype: bool

这是不合法的,因此它建议您使用返回一个布尔值的布尔函数,例如any()all()等。相反,您应该使用布尔索引

代码语言:javascript
复制
# df is the dataframe with your data
# adding column z
df['z'] = pd.Series(np.zeros(df.shape[0]))
# if y == 47472 then put 1000
df.loc[df['y']==47472, 'z'] = 1000
# filter <1000
df.loc[df['y']<1000, 'z'] = 2*df['y']
# now set rest to 2000 (i.e. ones that do not comply previous 2 conditions)
df.loc[(df['y']>=1000) & (df['y']!=47472),'z'] = 2000

编辑:,正如EdChum I所评论的那样,正在执行链式索引

代码语言:javascript
复制
df['z'][df['y']<1000] = 2*df['y']

应该通过使用loc来避免

代码语言:javascript
复制
df.loc[df['y']<1000, 'z'] = 2*df['y']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33867259

复制
相关文章

相似问题

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