Я создал функцию, которая изменяет значение ячейки в кадре данных pandas, чтобы избежать нечитаемых вещей, таких как df.loc[df.loc[df[].index.values[0]
et c. на протяжении большей части сценария:
def change_cell_value(df, identifier_column, identifier_value, target_column, target_value):
df.loc[df.loc[df[identifier_column] == identifier_value].index.values[0], target_column] = target_value
return df
В следующем примере я хочу изменить значение столбца «A» (target_column) в строке, где «имя» (столбец идентификатора) равно «x» (значение идентификатора).
Если я использую следующий метод, все работает, что видно при запуске следующего кода:
d = {'name': ['x', 'y'], 'A': [0, 0]}
df = pd.DataFrame(data=d)
print(df)
print('making change')
df = change_cell_value(df, 'name', 'x', 'A', 1)
print(df)
>>> name A
>>> 0 x 0
>>> 1 y 0
making change
>>> name A
>>> 0 x 1
>>> 1 y 0
Только значение имени 'x' в изменяется столбец «А».
Теперь, если кадр данных и функция являются частью объекта класса, оба имени («x» и «y») будут изменены.
class DataCollector:
def __init__(self, rows):
self.df = pd.DataFrame(columns=['name', 'A'])
for row in rows:
d = {'name': row, 'A': [0]}
df_row = pd.DataFrame(data=d)
self.df = self.df.append(df_row)
def change_cell_value(self, identifier_column, identifier_value, target_column, target_value):
df = self.df
df.loc[df.loc[df[identifier_column] == identifier_value].index.values[0], target_column] = target_value
self.df = df
rows = ['x', 'y']
db = DataCollector(rows)
print(db.df)
print('making change')
db.change_cell_value('name', 'x', 'A', 1)
print(db.df)
>>> name A
>>> 0 x 0
>>> 1 y 0
making change
>>> name A
>>> 0 x 1
>>> 1 y 1
Это почему? Как должна выглядеть функция в классе?