2015-03-23 1 views
0

Я пытаюсь прочитать определенный файл DF из файла и добавить к нему еще два столбца, содержащие, скажем, год и неделю из других столбцов в DF. Когда я применяю код для создания одного нового столбца, все работает отлично. Но когда создается несколько столбцов, это изменение не применяется. В частности, создаются новые столбцы, но их значения не то, что они должны быть.Изменение DataFrame не сохраняется при итерации

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

tbl = pd.read_csv(file).fillna('No Fill') 
date_cols = ['Col1','Col2'] 
for i in range(len(date_cols)): 
    tmp_col_name = date_cols[i] + '_WEEK' 
    tbl[tmp_col_name] = 'No Week' 
    bad_ind = list(np.where(tbl[date_cols[i]] == 'No Fill')[0])   
    tbl_ind = range(len(tbl)) 
    for i in range(len(bad_ind)): 
     tbl_ind.remove(bad_ind[i]) 
    tmp = pd.to_datetime(tbl[date_cols[i]][tbl_ind])   
    tbl[tmp_col_name][tbl_ind] = tmp.apply(lambda x: str(x.isocalendar()[0]) + '+' + str(x.isocalendar()[1])) 

Если я пытаюсь следующие строки, игнорируя возможные «пустые значения данных», все работает ...

tbl = pd.read_csv(file).fillna('No Fill') 
date_cols = ['Col1','Col2'] 
for i in range(len(date_cols)): 
    tmp_col_name = date_cols[i] + '_WEEK' 
    tbl[tmp_col_name] = 'No Week' 
    tmp = pd.to_datetime(tbl[date_cols[i]])   
    tbl[tmp_col_name] = tmp.apply(lambda x: str(x.isocalendar()[0]) + '+' + str(x.isocalendar()[1])) 

он должен делать с не изменяя все значения данных, но я не понять, почему изменение не применяется. В конце концов, до начала второй итерации DF, кажется, обновляется, а затем tbl[tmp_col_name] = 'No Week' для второй итерации «удаляет» изменения, сделанные в первой итерации, но только частично - она ​​покидает новый столбец созданные, но заполненные значениями «Неделя» ...

+2

Вы выполняете [цепочку индексирования] (http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy), которая может работать или не работать, в вашем случае это не работает, вам нужно использовать новые средства поиска 'loc',' iloc' или 'ix' для установки данных. – EdChum

+0

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

ответ

0

Огромное спасибо @EdChum! Выполнение цепочки индексирования может работать или не работать. В случае создания новых нескольких столбцов, а затем заполнения только некоторых из их значений, это не сработает. Точнее, он работает, но только в последнем обновленном столбце. Использование loc, iloc или ix для доступа к данным. В случае вышеуказанного кода, чтобы заставить его работать, нужно направить tbl_ind в np.array, используя tbl[col_name[j]].iloc[np.array(tbl_ind)] = tmp.apply(lambda x: x.year) Большое спасибо и кредит за ответ на @EdChum.