Установите значение для конкретной ячейки в фрейме данных 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 не изменились. Это снова только Нэн в кадре данных.
какие предложения?
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['C', 'x'] = 10подробнее о
.locздесь.
в моем примере я просто изменить его в выбранную ячейку
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, но это быстрее при замене одного значения
Я тоже искал эту тему, и я собрал способ итерации через фрейм данных и обновить его с помощью значений поиска из второго фрейма данных. Вот мой код.
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