如何将新列添加到由条件语句形成的表中?

时间:2017-02-01 13:24:40

标签: python csv pandas

我有一个非常简单的查询。

我有一个看起来像这样的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

2 个答案:

答案 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)