2017-02-01 3 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

Во-первых, ваш код в порядке. Вы просто заглавили свое имя dataframe как «данные» вместо того, чтобы делать «данные».

Однако для эффективного кода у EdChum есть отличный ответ выше. Или другой метод, аналогичный циклу for, но более простой код для запоминания:

import numpy as np 

data['Z'] = np.where(data.X >= data.Y, 1, 0) 
+0

Спасибо, особенно за более эффективные решения –

3

Вы можете сделать это без использования цикла с использованием ge, что означает больше или равен и бросьте булев массив INT с помощью astype:

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 

Но на самом деле это не нужно, поскольку есть vectorised метод здесь

Смежные вопросы