Обновление серии панд / df с помощью set_index () - PullRequest
0 голосов
/ 05 января 2019

С учетом следующих фреймов данных:

df = pd.DataFrame([["11","1", "2"], ["12","1", "2"], ["13","3", "4"]],
                 columns=["ix","a", "b"])
df1 = pd.DataFrame([["22","8", "9"], ["12","10", "11"], ["23","12", "13"]],
                     columns=["ix","c", "b"])

df                     df1
    ix  a   b        ix  c   b
0   11  1   2     0  22  8   9
1   12  1   2     1  12  10  11
2   13  3   4     2  23  12  13

если мы выполним df.update(df1), это обновит весь столбец ix & b кадра данных - df, так как номер индекса для обоих кадров данных одинаков.

Однако я пытался установить столбец ix в качестве индекса для обоих кадров данных и пытался обновить первый, как показано ниже:

df_new = df.set_index('ix').rename_axis(None).update(df1.set_index('ix').rename_axis(None))

Однако это ничего не возвращает.

Я ожидал, что это вернет фрейм данных со столбцом b, обновленным для df, где ix из df1 и df совпадают. Что-то вроде:

    a   b
11  1   2
12  1   11
13  3   4

Я что-то здесь упускаю? Разве df.update() не предназначен для выполнения в копии кадра данных? Может кто-нибудь объяснить мне, почему это происходит.

1 Ответ

0 голосов
/ 05 января 2019

update изменяет вызывающий DataFrame на месте. Из документов:

Изменить на месте, используя значения не-NA из другого DataFrame.

Выравнивает по индексам. Нет возвращаемого значения.

Итак, ваш единственный вариант - заранее установить индекс как отдельный шаг.

df.set_index('ix', inplace=True)
df.update(df1.set_index('ix'))
df.reset_index()

   ix  a   b
0  11  1   2
1  12  1  11
2  13  3   4

Если вы пытаетесь избежать изменения оригинала, это всегда другой вариант:

df_copy = df.set_index('ix')
df_copy.update(df1.set_index('ix'))
df_copy

    a   b
ix       
11  1   2
12  1  11
13  3   4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...