我有一个非常简单的查询。
我有一个如下所示的 csv:
ID X Y
1 10 3
2 20 23
3 21 34
我想添加一个名为 Z 的新列,如果 X 等于或大于 Y,则该列等于 1,否则等于 0。
到目前为止我的代码是:
import pandas as pd
data = pd.read_csv("XYZ.csv")
for x in data["X"]:
if x >= data["Y"]:
Data["Z"] = 1
else:
Data["Z"] = 0
最佳答案
您可以在不使用循环的情况下使用 ge
来完成此操作这意味着大于或等于,并使用 astype
将 bool 数组转换为 int :
In [119]:
df['Z'] = (df['X'].ge(df['Y'])).astype(int)
df
Out[119]:
ID X Y Z
0 1 10 3 1
1 2 20 23 0
2 3 21 34 0
关于您的尝试:
for x in data["X"]:
if x >= data["Y"]:
Data["Z"] = 1
else:
Data["Z"] = 0
这是行不通的,首先你使用的是Data
而不是data
,即使修复了这个问题,你也会将标量与数组进行比较,所以这会引发警告,因为将标量与数组进行比较是不明确的,第三,您要分配整个列,因此会覆盖该列。
您需要访问您的循环无法访问的索引标签,您可以使用 iteritems
为此:
In [125]:
for idx, x in df["X"].iteritems():
if x >= df['Y'].loc[idx]:
df.loc[idx, 'Z'] = 1
else:
df.loc[idx, 'Z'] = 0
df
Out[125]:
ID X Y Z
0 1 10 3 1
1 2 20 23 0
2 3 21 34 0
但实际上这是不必要的,因为这里有一个矢量化方法
关于python - 如何向由条件语句形成的表添加新列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41980944/