Изменение значения ячейки pandas df не работает в классе - PullRequest
0 голосов
/ 21 января 2020

Я создал функцию, которая изменяет значение ячейки в кадре данных 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

Это почему? Как должна выглядеть функция в классе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...