Обновление фрейма данных pandas значениями из другого фрейма данных

#python #pandas

#python #pandas

Вопрос:

Предполагая, что фрейм данных, в котором значения из любого из столбцов могут изменяться, учитывая другой фрейм данных, который содержит старое значение, новое значение и столбец, к которому он принадлежит, как обновить фрейм данных, используя информацию об изменениях? Например:

 >>> my_df
    x    y    z
0   1    2    5
1   2    3    9
2   8    7    2
3   3    4    7
4   6    7    7
  

my_df_2 содержит информацию об измененных значениях и их столбцах:

 >>> my_df_2
    changed_col    old_value    new_value
0      x              2             10
1      z              9             20
2      x              1             12
3      y              4             23
  

Как использовать информацию my_df_2 для обновления my_df , чтобы my_df теперь стало:

 >>> my_df
    x     y     z
0   12    2     5
1   10    3     20
2   8     7     2
3   3     23    7
4   6     7     7
  

Ответ №1:

Вы можете создать словарь для изменений следующим образом:

 d = {i: dict(zip(j['old_value'], j['new_value'])) for i, j in my_df_2.groupby('changed_col')}

d
Out: {'x': {1: 12, 2: 10}, 'y': {4: 23}, 'z': {9: 20}}
  

Затем используйте его в DataFrame.replace:

 my_df.replace(d)
Out: 
    x   y   z
0  12   2   5
1  10   3  20
2   8   7   2
3   3  23   7
4   6   7   7
  

Ответ №2:

Вы можете использовать метод обновления. См. http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas .DataFrame.update.html

Пример:

 old_df = pd.DataFrame({"a":np.arange(5), "b": np.arange(4,9)})

 ---- ----- ----- 
|    |   a |   b |
|---- ----- -----|
|  0 |   0 |   4 |
|  1 |   1 |   5 |
|  2 |   2 |   6 |
|  3 |   3 |   7 |
|  4 |   4 |   8 |
 ---- ----- ----- 

new_df = pd.DataFrame({"a":np.arange(7,8), "b": np.arange(10,11)})
 ---- ----- ----- 
|    |   a |   b |
|---- ----- -----|
|  0 |   7 |  10 |
 ---- ----- ----- 

old_df.update(new_df) 
 ---- ----- ----- 
|    |   a |   b |
|---- ----- -----|
|  0 |   7 |  10 | #Changed row
|  1 |   1 |   5 |
|  2 |   2 |   6 |
|  3 |   3 |   7 |
|  4 |   4 |   8 |
 ---- ----- -----