#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 |
---- ----- -----