我有一个非常简单的查询。
我有一个看起来像这样的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
答案 0 :(得分:3)
你可以在不使用循环的情况下使用ge
来实现这一点,这意味着大于或等于并使用astype
将布尔数组转换为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
但实际上这是不必要的,因为这里有一个矢量化方法
答案 1 :(得分:0)
首先,你的代码很好。您只需将数据框名称大写为“数据”,而不是将其设为“数据”。
然而,对于有效的代码,EdChum上面有一个很好的答案。或者另一种方法类似于for循环的效率,但更容易记住代码:
import numpy as np
data['Z'] = np.where(data.X >= data.Y, 1, 0)