2017-01-12 2 views
1

Я чтение данных в кусках из CSV, как это:Панда добавив несколько дополнительных столбцов на основе многих условий

 for chunk in pd.read_csv(file, chunksize=50000, names = col_names, header = 0, dtype = dtype): 
      chunk['derived_field_1'] = [1 if x == 'High' else -1 for x in chunk['indicator']] 

выше работает и она основана на одном условии. Я хочу сделать это на основе условий на двух полях. Создание общего количества комбинаций значений будет 8. В качестве примера

chunk['derived_field_2'] = [chunk['column_1'] if ((x == 'Red' for x in chunk['Color']) and (y == 'High' for y in chunk['Indicator'])) else 
          chunk['column_2'] if ((x == 'Green' for x in chunk['Color']) and (y == 'Low' for y in chunk['Indicator'])) else 0] 

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

raise ValueError('Length of values does not match length of ' 'index') 
ValueError: Length of values does not match length of index 

Может кто-нибудь знать причину этой ошибки?

ответ

2

Вы можете использовать numpy.where для векторизованного решения:

import numpy as np 
chunk['derived_field_2'] = (np.where((chunk['Color'] == "Red") & (chunk["Indicator"] == "High"), chunk["column_1"], 
    np.where((chunk['Color'] == "Green") & (chunk["Indicator"] == "Low"), chunk["column_2"], 0)) 
+1

Спасибо за ответ :) – CodeGeek123

+0

Привет это до сих пор вызывает ошибку: поднять ValueError («Длина значений не соответствует длине» «индекс») ValueError: Длина значений не соответствует длине индекса. Вы столкнулись с этим раньше? Я установил min_itemsize на большее число, но это не сработало – CodeGeek123

+0

Я не могу придумать причину, по которой это не получится. Просто протестировано в небольшом файле, кажется, работает нормально. – Psidom

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