Вы можете использовать numpy.where
для выбора значения из одного столбца (значений по умолчанию), если условие для этой строки (is.na) совпадает, иначе выберите значения из другого столбца (в в данном случае тот же столбец).
import pandas as pd
import numpy as np
from io import StringIO
TESTDATA = """
group_id,start_time,end_time
1,NA,20000
1,40000,20000
1,30000,NA
2,NA,35000
2,45000,22000
2,50000,21000
2,45000,NA
"""
df = pd.read_csv(StringIO(TESTDATA), sep=",") # parse your sample data
В этом случае запрошенные вами значения по умолчанию являются первым / последним из каждой группы, поэтому нам нужно будет построить столбцы для них:
start_time_last = df.groupby("group_id")["start_time"].last()
end_time_first = df.groupby("group_id")["end_time"].first()
merged = df.join(start_time_last, on='group_id', how='left', rsuffix='_last').join(end_time_first, on='group_id', how='left', rsuffix='_first')
Теперь мы можем используйте np.where
для заполнения значений na
:
merged["start_time"] = np.where(pd.isna(merged["start_time"]), merged["start_time_last"], merged["start_time"])
merged["end_time"] = np.where(pd.isna(merged["end_time"]), merged["end_time_first"], merged["end_time"])
print(merged)
Дает:
group_id start_time end_time start_time_last end_time_first
0 1 30000.0 20000.0 30000.0 20000.0
1 1 40000.0 20000.0 30000.0 20000.0
2 1 30000.0 20000.0 30000.0 20000.0
3 2 45000.0 35000.0 45000.0 35000.0
4 2 45000.0 22000.0 45000.0 35000.0
5 2 50000.0 21000.0 45000.0 35000.0
6 2 45000.0 35000.0 45000.0 35000.0