2015-03-02 4 views
1

У меня есть столбец с именем HousSize и столбец Independent. Я хочу, чтобы создать переменную, которая равна 1, если HouseholdSize равно 1 и Independent не равен 1. Мой текущий код выглядит следующим образом:Создание переменной с использованием критериев из нескольких столбцов (PANDAS)

 df["HH1flag"] = df.where((df.HouseholdSize ==1) & (df.Independent != 1).notnull().astype(int)) 
      HH1flag = df[df.HH1flag == 1] 
      pd.DataFrame(HH1flag, columns=["LocIdent","HouseholdSize","Independent"]).to_csv(Targcsv, mode='ab') 

Я получаю следующее сообщение об ошибке: AttributeError: «поплавок» объект имеет no attribute 'all'

Редактировать: С некоторой помощью от EdChum я добавляю немного больше информации по этому вопросу. Упрощенная версия моего пересмотренного кода выглядит следующим образом:

import pandas as pd 
from pandas import * 
import csv 

FileName='HouseholdSizeTest.xlsx' 
data=pd.read_excel(FileName,'Sheet1') 
df=pd.DataFrame(data) 
Targcsv=('target.csv') 

HH1Text= [['Table C.1 HouseholdSize Check 1']] 
with open(Targcsv,'ab') as f: 
    titles=csv.writer(f) 
    titles.writerow([]) 
    titles.writerows(HH1Text) 
    titles.writerow([]) 

df["HH1flag"] = df[(df.HouseholdSize ==1) & (df.Independent != 1)].notnull().astype(int) 
HH1flag = df[df.HH1flag == 1] 
pd.DataFrame(HH1flag, columns=["LocIdent","HouseholdSize","Independent"]).to_csv(Targcsv, mode='ab') 

я получаю новую ошибку, для той же линии. Ошибка ValueError: неправильное количество элементов, переданных 3, размещение подразумевает 1. Я изо всех сил пытаюсь правильно вставить данные в это редактирование, но представьте три случая. первый с Independent = 1 и HousSize = 1, второй с Independent = 0 и HousSize = 3, а третий с Independent = 47 и HousSize = 1. Для третьего случая, HH1flag должен быть равен 1.

+1

Вы делаете это правильно? Вы не указали, какая строка выдает ошибку, я предполагаю, что это первая строка, поскольку она выглядит странно для меня, вы хотите этого вместо этого: 'df [" HH1flag "] = df.where ((df.HouseholdSize == 1) & (df.Independent! = 1)). Notnull(). Astype (int) '? – EdChum

+0

Привет, EdChum. Извините, что не указав, это первая строка, которая выдает ошибку. Я попробовал вставить код, который у вас есть, в свой комментарий в мой код, и я получил ту же ошибку. Любые мысли о том, что может быть причиной этого? – lbug

+0

Можете ли вы опубликовать исходные данные и код для создания df, чтобы мы могли воспроизвести вашу ошибку, спасибо – EdChum

ответ

1

Если вы хотите столбец индикатора, то вы можете использовать np.where:

df["HH1flag"] = np.where((df.HouseholdSize ==1) & (df.Independent != 1), 1, 0) 

Так что это использует переданное в состоянии и, если истинные возвращает 1, если ложь он возвращает 0.

Причина, по которой мое первое предложение не срабатывало, было потому, что это возвращает серию с несколькими значениями столбцов, которые не то, что вы хотели.

Когда вы сделали df.where это не нравится пытается бросить свой ряд и поднял ставку AttributeError:

AttributeError: 'float' object has no attribute 'all'

Я не знаю, почему он это делает, нет ничего особенного в ваших данных, как я смог воспроизвести это с помощью простого df, состоящего только из ints.

+0

Hi EdChum, Быстрый вопрос. Я попытался использовать оператор «или» с тремя столбцами с кодом, похожим на следующий: df [«NCP2flag»] = np.where ((df.NCPFlag == 1) & ((df.NCPIncReported == -999) или (df.NCPPCReported == -999)), 1, 0) Я получаю сообщение об ошибке: ValueError: Значение истинности серии неоднозначно. Используйте a.empty, a.bool(), a.item(), a.any() или a.all(). Есть ли способ переписать строку, чтобы обойти это? Я знаю, что на данный момент это становится действительно конкретным, но я очень ценю вашу помощь! – lbug

+1

Вы не можете использовать 'и', 'или', когда вы сравниваете массивы, следовательно, вы должны использовать побитовые операторы так:' df ["NCP2flag"] = np.where ((df.NCPFlag == 1) & ((df.NCPIncReported == -999) | (df.NCPPCReported == -999)), 1, 0) ' – EdChum

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