使用if/else语句生成新的变量数值列

2024-04-25 20:58:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

          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: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Tags: theto数据testlt示例returnif
1条回答
网友
1楼 · 发布于 2024-04-25 20:58:35

问题是您在if语句中使用了一个序列,例如:

if y == 47472:

假设y是数据帧的一部分,这将产生布尔值列表:

^{pr2}$

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

# 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所说,我正在执行chained indexing

df['z'][df['y']<1000] = 2*df['y']

应通过使用loc来避免:

df.loc[df['y']<1000, 'z'] = 2*df['y']

相关问题 更多 >