2017-02-01 43 views
1

我有一個非常簡單的查詢。如何將新列添加到由條件語句形成的表中?

我有一個csv,看起來像這樣:

ID X Y 
1 10 3 
2 20 23 
3 21 34 

而且我想添加一個名爲Z排列新列等於1,如果x比y等於或更大,否則返回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 
+1

代碼有什麼問題? –

+1

也許可以將'Data'更改爲'data'? –

+0

請[編輯]你的問題,並確切指出你在問什麼。如果程序產生錯誤,它是什麼以及在哪一行。如果輸出錯誤,請描述它的外觀和外觀。我們不是介意... – martineau

回答

0

首先這是不必要的,你的代碼很好。您只需將數據框名稱大寫爲「數據」,而不是將其設置爲「數據」。

但是,對於高效的代碼,EdChum上面有一個很好的答案。或者另一種類似for循環的方法效率更高但更容易記憶的代碼:

import numpy as np 

data['Z'] = np.where(data.X >= data.Y, 1, 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 

但實際上是有向量化方法在這裏

相關問題