Как заполнить na на основе другого значения в той же группе на Python - PullRequest
1 голос
/ 28 мая 2020

Я хочу заполнить NA в моем наборе данных на основе значения из другой строки в той же группе.

Данные выглядят так.

 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

Я хочу получить это результат:

 group_id, start_time, end_time  
        1, 30000, 20000
        1, 40000, 20000
        1, 30000, 20000
        2, 45000, 35000
        2, 45000, 22000
        2, 50000,21000
        2, 45000, 35000

Таким образом, первое и последнее значение в каждой группе одинаковы как для start_time, так и для end_time.

Ответы [ 3 ]

1 голос
/ 28 мая 2020

Вы можете сделать это, используя fillna, groupby, tranform и функции агрегирования first или last, как описано в этом ответе

df['start_time'] = df['start_time'].fillna(df.groupby('group_id')['start_time'].transform('last'))
df['end_time'] = df['end_time'].fillna(df.groupby('group_id')['end_time'].transform('first'))
0 голосов
/ 28 мая 2020

Вы можете использовать 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
0 голосов
/ 28 мая 2020

Вы можете заставить al oop перебирать это, и если значение NA, измените его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...