немного новичок в пандах и ищу, возможно, лучший способ решить следующую проблему:
учитывая 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']
Вы можете просто использовать .loc
.
df.loc[df['A']=='bb', 'C'] = 1
Для меня основным преимуществом .at
является то, что он требует выделения только одной ячейки, но если вы уже знаете, что bb
уникален, нет необходимости выполнять дополнительную работу.
о боже! Спасибо!! это было в основном так просто. я пропустил df в первом [] случайно не знаешь, зачем это нужно (к тому же без него не работает :))?
@boopdebop Ты имеешь в виду то место, где ты написал 'A'=='bb'
? Это потому, что 'A'
— это не столбец фрейма данных, а просто строка. 'A'=='bb'
→ False
мне интересно, знаете ли вы, зачем нужен этот вызов df 'df['A']=='bb''
Я даже просматривал документацию, но только сейчас обнаружил, что это необходимо, а не зачем - я думаю, есть какой-то способ понять, почему вам нужно это добавить ... для меня это кажется лишним - в контексте loc внутри [] я уже нахожусь в фрейме данных, я думаю, это необходимо по какой-то причине, и меня, вероятно, сбивает с толку наличие разных способов поиска в .query
@boopdebop «я уже в фрейме данных» — нет, в Python этого нет. Возможно, вы думаете о with()
в R, хотя это работает с именами (A
), а не со строками ("A"
).
@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
df.loc[df['A']=='bb','C'] = 1
loc возвращает true/false для каждой строки и обновляет только те значения, где условие истинно, что устраняет необходимость указывать точный индекс.