2013-09-10 2 views
0

Я пытаюсь выполнить итерацию по элементам в фрейме данных и обновить текущую строку.Обновление одной ячейки для ключа в pandas

Я выполняю итерацию (вместо использования df.apply), поскольку мне нужно обрабатывать файлы на основе значений в dataframe. Примечание: по разным причинам я не хочу использовать df.apply здесь.

df является dataframe

for key,item in df.iterrows(): 
    df.xs(key)['downloaded']=True 

если я

df[:5] 

поле 'Загруженные' не была обновлена ​​(Это показывает, как False). Как я могу это правильно обновить?

По существу, я хочу обновить одно значение столбца для заданного ключа.

+0

Почему вы используете 'xs'? Вы нарезаете «MultiIndex»? –

ответ

4

Как @Phillip Облако указывает, loc лучше для этой работы. И если вы укажете ключ как кортеж, вы можете также установить мультииндекс.

In [2]: mi = DataFrame(dict(
     A = np.arange(5).astype(np.float64), 
     B = np.arange(5).astype(np.int64)), 
      index=MultiIndex.from_tuples(tuple(zip(*[['bar','bar','baz','baz','baz'],['one','two','one','two','three']])),names=['first','second'])) 

In [3]: mi 
Out[3]: 
       A B 
first second  
bar one  0 0 
     two  1 1 
baz one  2 2 
     two  3 3 
     three 4 4 

In [4]: mi.loc[('baz','two'),'B'] = -5 

In [5]: mi 
Out[5]: 
       A B 
first second  
bar one  0 0 
     two  1 1 
baz one  2 2 
     two  3 -5 
     three 4 4 
0

xs() создает копию данных по умолчанию, так, чтобы изменить исходные данные, вы должны пройти copy=False:

for key,item in df.iterrows(): 
    df.xs(key, copy=False)['downloaded']=True 
+0

Этот тип прикованных заданий * не рекомендуется. Гораздо понятнее сделать 'df.loc [key, 'loaded'] = True'. Это не работает для 'key', которые являются многомерными, хотя. http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy. О –

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