Я создал Pandas DataFrame
df = DataFrame(index=['A','B','C'], columns=['x','y'])
и получил это
ху NaN NaN B NaN NaN C NaN NaN
Затем я хочу присвоить значение определенной ячейке, например, для строки «C» и столбца «x». Я ожидал получить такой результат:
ху NaN NaN B NaN NaN C 10 NaN
с этим кодом:
df.xs('C')['x'] = 10
но содержание df
не изменилось. Это снова только NaN
в DataFrame.
Какие-либо предложения?
df['x']['C']
), используйтеdf.ix['x','C']
.dataframe[column (series)] [row (Series index)]
многие люди (включая меня) более привыкли кdataframe[row][column]
порядку. Как программист на Matlab и R, последний чувствует себя более интуитивно понятным для меня, но, видимо, это не тот способ, которым работаетОтветы:
Ответ RukTech ,
df.set_value('C', 'x', 10)
намного быстрее, чем варианты, которые я предложил ниже. Однако, это было намечено для обесценивания .В дальнейшем рекомендуемый метод
.iat/.at
.Почему
df.xs('C')['x']=10
не работает:df.xs('C')
по умолчанию возвращает новый фрейм данных с копией данных, поэтомуизменяет только этот новый фрейм данных.
df['x']
возвращает представление информационногоdf
кадра, поэтомумодифицирует
df
себяПредупреждение : иногда трудно предсказать, вернет ли операция копию или представление. По этой причине в документах рекомендуется избегать назначений с «цепной индексацией» .
Таким образом, рекомендуемая альтернатива
который делает изменение
df
.источник
df.x
в API . Что ты имел в виду?'x'
имя столбца вdf
.df.x
возвращаетSeries
со значениями в столбцеx
. Я изменю его на,df['x']
поскольку эта нотация будет работать с любым именем столбца (в отличие от точечной нотации), и я думаю, что это более понятно.df.x
был какой-то неизвестный новый метод рядомdf.xs, df.ix
df.xs(..., copy=True)
возвращает копию, и это поведение по умолчанию.df.xs(..., copy=False)
возвращает оригинал.Обновление:
.set_value
метод будет объявлен устаревшим ..iat/.at
являются хорошими заменами, к сожалению, панды предоставляет мало документацииСамый быстрый способ сделать это - использовать set_value . Этот метод в ~ 100 раз быстрее, чем
.ix
метод. Например:df.set_value('C', 'x', 10)
источник
df['x']['C'] = 10
.df=df.append(df.sum(numeric_only=True),ignore_index=True)
?Вы также можете использовать условный поиск,
.loc
как показано здесь:где
<some_column_name
- столбец, с которым вы хотите проверить<condition>
переменную, и<another_column_name>
столбец, к которому вы хотите добавить (может быть новый столбец или столбец, который уже существует).<value_to_add>
это значение, которое вы хотите добавить в этот столбец / строку.Этот пример не работает точно с рассматриваемым вопросом, но он может быть полезен для тех, кто хочет добавить определенное значение на основе условия.
источник
df.loc[df['age']==3, ['age-group']] = 'toddler'
Рекомендуемый способ (по словам сопровождающих) установить значение:
Использование «цепной индексации» (
df['x']['C']
) может привести к проблемам.Видеть:
источник
ix
является устаревшим: pandas-docs.github.io/pandas-docs-travis/...Попробуйте использовать
df.loc[row_index,col_indexer] = value
источник
Это единственное, что сработало для меня!
Узнайте больше о
.loc
здесь .источник
.loc
замену.iat/.at
?at
Аналогично томуloc
, что оба обеспечивают поиск на основе меток. Используйте,at
если вам нужно только получить или установить одно значение в DataFrame или Series. Из падас док.iat/.at
это хорошее решение. Предположим, у вас есть этот простой data_frame:если мы хотим изменить значение ячейки,
[0,"A"]
вы можете использовать одно из этих решений:df.iat[0,0] = 2
df.at[0,'A'] = 2
И вот полный пример того, как использовать,
iat
чтобы получить и установить значение ячейки:y_train до:
y_train после вызова функции prepossessing, которую
iat
нужно изменить, чтобы умножить значение каждой ячейки на 2:источник
Чтобы установить значения, используйте:
set_value
,ix
не рекомендуется.iloc
иloc
источник
Вы можете использовать
.iloc
.источник
df.iloc[[2:8], [0]] = [2,3,4,5,6,7]
которые методdf.loc()
делает изначально.В моем примере я просто изменить его в выбранной ячейке
'result' - это поле данных со столбцом 'weight'
источник
set_value()
устарел.Начиная с версии 0.23.4, Pandas " объявляет о будущем " ...
Учитывая этот совет, вот демонстрация того, как их использовать:
Ссылки:
источник
Вот сводка действительных решений, предоставленных всеми пользователями, для фреймов данных, индексированных по целому числу и строке.
df.iloc, df.loc и df.at работают для обоих типов фреймов данных, df.iloc работает только с целочисленными индексами строк / столбцов, df.loc и df.at поддерживают установку значений с использованием имен столбцов и / или целочисленных индексов ,
Если указанный индекс не существует, и df.loc, и df.at добавят вновь вставленные строки / столбцы в существующий фрейм данных, но df.iloc вызовет «IndexError: позиционные индексаторы выходят за пределы». Рабочий пример, протестированный в Python 2.7 и 3.7, выглядит следующим образом:
источник
Я проверил, и вывод
df.set_value
немного быстрее, но официальный методdf.at
выглядит как самый быстрый и не устаревший способ сделать это.Обратите внимание, что это установка значения для одной ячейки. Для векторов
loc
иiloc
должны быть лучшие варианты, так как они векторизованы.источник
Один из способов использования индекса с условием - сначала получить индекс всех строк, которые удовлетворяют вашему условию, а затем просто использовать эти индексы строк несколькими способами.
Пример условия как
Затем вы можете использовать эти индексы строк различными способами, такими как
Это все возможно, потому что .index возвращает массив индекса, который .loc может использовать с прямой адресацией, поэтому он избегает обходов снова и снова.
источник
df.loc['c','x']=10
Это изменит значение c- й строки и x- го столбца.источник
В дополнение к ответам, приведенным выше, приведен сравнительный анализ различных способов добавления строк данных в уже существующий фрейм данных. Это показывает, что использование at или set-value является наиболее эффективным способом для больших фреймов данных (по крайней мере, для этих условий тестирования).
Для теста использовался существующий фрейм данных, состоящий из 100 000 строк и 1000 столбцов и случайных числовых значений. К этому фрейму данных было добавлено 100 новых строк.
Код смотри ниже:
источник
Если вы хотите изменить значения не для всей строки, а только для некоторых столбцов:
источник
С версии 0.21.1 вы также можете использовать
.at
метод. Есть некоторые отличия по сравнению с.loc
упомянутыми здесь - pandas .at и .loc , но это быстрее при замене одного значенияисточник
Так, ваш вопрос, чтобы преобразовать NaN в ['x', C] в значение 10
ответ..
альтернативный код
источник
Я тоже искал эту тему, и я собрал способ перебирать DataFrame и обновлять его поисковыми значениями из второго DataFrame. Вот мой код
источник