Установите значение для конкретной ячейки в фрейме данных pandas с помощью индекса





Я создал панд DataFrame



df=DataFrame(index=['A','B','C'], columns=['x','y'])


и




x y
A NaN NaN
B NaN NaN
C NaN NaN




Затем я хочу присвоить значение определенной ячейке, например, для строки " C "и столбца "x".
Я ожидал получить такой результат:




x y
A NaN NaN
B NaN NaN
C 10 NaN


этот код:



df.xs('C')['x']=10


но содержание df не изменились. Это снова только Нэн в кадре данных.



какие предложения?

2243   12  

12 ответов:

ответ Руктех,df.set_value('C', 'x', 10), далеко и далеко быстрее, чем варианты, которые я предложил ниже. Тем не менее, это было планируется отменить.

идти вперед,рекомендуется .iat/.at.


почему df.xs('C')['x']=10 не работает:

df.xs('C') по умолчанию возвращает новый фрейм данных копия данных, так

df.xs('C')['x']=10

изменяет только этот новый фрейм данных.

df['x'] возвращает представление df фрейм данных, так что

df['x']['C'] = 10

изменение df сам по себе.

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


так что рекомендуемая альтернатива это

df.at['C', 'x'] = 10

, который тут изменить df.


In [18]: %timeit df.set_value('C', 'x', 10)
100000 loops, best of 3: 2.9 µs per loop

In [20]: %timeit df['x']['C'] = 10
100000 loops, best of 3: 6.31 µs per loop

In [81]: %timeit df.at['C', 'x'] = 10
100000 loops, best of 3: 9.2 µs per loop

Обновление: The .способ значение будет устаревший. .iat/. at являются хорошими заменами, к сожалению панды предоставляет мало документации


самый быстрый способ сделать это с помощью set_value. Этот метод ~в 100 раз быстрее, чем .ix метод. Например:

df.set_value('C', 'x', 10)

вы также можете использовать условный поиск с помощью .loc Как видно здесь:

df.loc[df[<some_column_name>] == <condition>, <another_column_name>] = <value_to_add>

здесь <some_column_name - это столбец, который вы хотите проверить <condition> переменной "против" и <another_column_name> - это столбец, который вы хотите добавить (может быть новый столбец или тот, который уже существует). <value_to_add> - это значение, которое вы хотите добавить в этот столбец/строку.

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

рекомендуемый способ (согласно сопровождающим) установить значение:

df.ix['x','C']=10

С помощью "цепной индексации" (df['x']['C']) могут привести к проблемам.

посмотреть:

попробуйте использовать df.loc[row_index,col_indexer] = value

это единственное, что работал для меня!

df.loc['C', 'x'] = 10

подробнее о .locздесь.

можно использовать .iloc.

df.iloc[[2], [0]] = 10

в моем примере я просто изменить его в выбранную ячейку

    for index, row in result.iterrows():
        if np.isnan(row['weight']):
            result.at[index, 'weight'] = 0.0

'result' - это поле данных со столбцом 'weight'

Если вы хотите изменить значения не всю подряд, а только для некоторых столбцов:

x = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
x.iloc[1] = dict(A=10, B=-10)

из версии 0.21.1 вы также можете использовать .at метод. Есть некоторые различия по сравнению с .loc Как уже упоминалось здесь - панды. в versus .loc, но это быстрее при замене одного значения

df.loc['c','x']=10 Это изменит значение c - ой строки и xth колонка.

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

src_df = pd.read_sql_query(src_sql,src_connection)
for index1, row1 in src_df.iterrows():
    for index, row in vertical_df.iterrows():
        src_df.set_value(index=index1,col=u'etl_load_key',value=etl_load_key)
        if (row1[u'src_id'] == row['SRC_ID']) is True:
            src_df.set_value(index=index1,col=u'vertical',value=row['VERTICAL'])

Comments

    Ничего не найдено.