Изменение значения кадра данных на основе уникального значения строки

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

учитывая df, где я знаю уникальное значение (bb) в столбце (A), я хочу изменить значение, найденное в другом столбце (C)

решение, которое, на мой взгляд, кажется немного сложным, заключается в следующем:

import pandas as pd

df = pd.DataFrame({"A":['aa', 'bb', 'cc'],
                   "B":[1, 1, 1],
                   "C":[1, 88, 1],
                   "D":[1, 1, 1]})

print(df, '\n')

df.at[int(df.loc[df['A']=='bb', 'C'].index.values), 'C'] = 1

print(df)

но я думаю, есть более простой способ добиться этого?

Я думаю, поскольку это кажется довольно основной потребностью, я надеялся найти что-то вроде:

df.at_or_something_else['A'=='bb', 'C']
df.loc[df['A']=='bb','C'] = 1 loc возвращает true/false для каждой строки и обновляет только те значения, где условие истинно, что устраняет необходимость указывать точный индекс.
Chris 21.08.2024 18:03
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете просто использовать .loc.

df.loc[df['A']=='bb', 'C'] = 1

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

о боже! Спасибо!! это было в основном так просто. я пропустил df в первом [] случайно не знаешь, зачем это нужно (к тому же без него не работает :))?

boopdebop 21.08.2024 18:32

@boopdebop Ты имеешь в виду то место, где ты написал 'A'=='bb'? Это потому, что 'A' — это не столбец фрейма данных, а просто строка. 'A'=='bb'False

wjandrea 21.08.2024 18:46

мне интересно, знаете ли вы, зачем нужен этот вызов df 'df['A']=='bb''

boopdebop 22.08.2024 13:39

Я даже просматривал документацию, но только сейчас обнаружил, что это необходимо, а не зачем - я думаю, есть какой-то способ понять, почему вам нужно это добавить ... для меня это кажется лишним - в контексте loc внутри [] я уже нахожусь в фрейме данных, я думаю, это необходимо по какой-то причине, и меня, вероятно, сбивает с толку наличие разных способов поиска в .query

boopdebop 22.08.2024 14:08

@boopdebop «я уже в фрейме данных» — нет, в Python этого нет. Возможно, вы думаете о with() в R, хотя это работает с именами (A), а не со строками ("A").

wjandrea 22.08.2024 18:45

@wjandrea дала самый идиоматический ответ.

Однако если вам нужно искать запись, используя несколько столбцов, следующий SQL-подобный стиль может выглядеть более читабельным.

Вот небольшая демонстрация вашего DF:

df.loc[df.query("A == 'bb' and B == 1 and D == 1").index, "C"] = 100

по сравнению с классическими подходами:

df.loc[(df["A"] == "bb") & (df["B"] == 1) & (df["D"] == 1), "C"] = 100

или

df.loc[df["A"].eq("bb") & df["B"].eq(1) & df["D"].eq(1), "C"] = 100

Другие вопросы по теме