wolverine777
@wolverine777

Как заменять нули на значения из другого датафрейма?

Привет!

У меня есть два датафрейма, один состоит из двух колонок:

total_acc	mort_acc
0	         25.0	0.0
1	         27.0	3.0
2	         26.0	0.0
3	         13.0	0.0
4	         43.0	1.0


а второй такой вот:

mort_acc
total_acc	
13.0	       0.078963
25.0	       0.052023
26.0	       0.066743
5.0	       0.103289
6.0	       0.151293


Мне нужно заменить нули в первом датафрейме в колонке mort_accна их соответствующие значения total_acc из второго датафрейма.

Должно получиться

total_acc	  mort_acc
0	         25.0	0.052023
1	         27.0	3.0
2	         26.0	0.066743
3	         13.0	0.078963
4	         43.0	1.0


я пытаюсь сделать что-то типа df['mort_acc'].replace(to_replace=0, value=... (не пойму как выцепить нужное значение из второго датафрейма) )

Спасибо!
  • Вопрос задан
  • 141 просмотр
Пригласить эксперта
Ответы на вопрос 1
@dzhebrak
Как вариант, можно разбить в первом датафрейме колонку mort_acc на две по разделителю (tab или какой указан у вас в строке), чтобы в первой дополнительной колонке (например, mort_acc_1) было значение 25.0, а во второй (mort_acc_2) - 0.0.

Затем сделать merge https://pandas.pydata.org/pandas-docs/stable/refer... датафреймов 1 и 2, после чего собрать новый датафрейм только с нужными данными (или удалить ненужные колонки).

Пример

import pandas as pd
import numpy as np

sep = '  '

df1 = pd.DataFrame({
    'total_acc': range(0, 5),
    'mort_acc': ["25.0  0.0", "27.0  3.0", "26.0  0.0", "13.0  0.0", "43.0  1.0"],
})
# разбиваем колонку mort_acc на две новые и приводим их к числовому типу (нужно для merge)
df1[['mort_acc_1', 'mort_acc_2']] = df1['mort_acc'].str.split(sep, expand=True)
df1["mort_acc_1"] = pd.to_numeric(df1["mort_acc_1"])
df1["mort_acc_2"] = pd.to_numeric(df1["mort_acc_2"])

df2 = pd.DataFrame({
    'mort_acc': [13.0, 25.0, 26.0, 5.0, 6.0],
    'total_acc': [0.078963, 0.052023, 0.066743, 0.103289, 0.151293],
})

# делаем merge первого и второго датафреймов
tmp = pd.merge(df1, df2, how='left', left_on='mort_acc_1', right_on='mort_acc')

# собираем новый датафрейм с нужными колонками
df = pd.DataFrame({})
df['total_acc'] = tmp['total_acc_x']
df['mort_acc'] = np.where(
    pd.notnull(tmp['total_acc_y']),
    tmp['mort_acc_1'].astype(str) + sep + tmp['total_acc_y'].astype(str),
    tmp['mort_acc_1'].astype(str) + sep + tmp['mort_acc_2'].astype(str)    
)

df
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы