для каждого значения в столбце dataframe я хочу создать значения в другом столбце (панды) - PullRequest
2 голосов
/ 09 ноября 2019

У меня есть данные многих пациентов и их измерения за шесть часов, но для некоторых пациентов были записаны не все значения за шесть часов. Я хочу для каждого идентификатора субъекта добавить значения от 1 до 6 в столбце часа, и если значение часа уже существует, напишите ему то же значение, в противном случае оставьте это поле пустым.
примечание (я буду иметь дело с этими пустыми значениями, используяметоды пропущенного значения позже.)

subject_id      hour        value
    2                 1           23
    2                 3           15
    2                 5           28
    2                 6           11
    3                 4           18
    3                 6           22

это тот самый результат, который я хочу получить

  subject_id      hour        value
        2                 1           23
        2                 2     
        2                 3           15
        2                 4
        2                 5           28
        2                 6           11
        3                 1            
        3                 2           
        3                 3           
        3                 4           18
        3                 5           
        3                 6           22

любой может помочь мне, как сделать так, чтобы любая помощь была оценена

1 Ответ

4 голосов
/ 09 ноября 2019

Использование DataFrame.reindex с MultiIndex.from_product:

mux = pd.MultiIndex.from_product([df['subject_id'].unique(), np.arange(1,7)],
                                  names=['subject_id','hour'])
df = df.set_index(['subject_id','hour']).reindex(mux).reset_index()
print (df)
    subject_id  hour  value
0            2     1   23.0
1            2     2    NaN
2            2     3   15.0
3            2     4    NaN
4            2     5   28.0
5            2     6   11.0
6            3     1    NaN
7            3     2    NaN
8            3     3    NaN
9            3     4   18.0
10           3     5    NaN
11           3     6   22.0

Альтернативой является создание всех возможных комбинаций с помощью product, а затем DataFrame.merge с левым соединением:

from  itertools import product
df1 = pd.DataFrame(list(product(df['subject_id'].unique(), np.arange(1,7))),
                                  columns=['subject_id','hour'])
df = df1.merge(df, how='left')
print (df)
    subject_id  hour  value
0            2     1   23.0
1            2     2    NaN
2            2     3   15.0
3            2     4    NaN
4            2     5   28.0
5            2     6   11.0
6            3     1    NaN
7            3     2    NaN
8            3     3    NaN
9            3     4   18.0
10           3     5    NaN
11           3     6   22.0

РЕДАКТИРОВАТЬ: Если получить ошибку:

не может обработать неуникальный многоиндексный

Это означает дублированные значения для subject_id с hour.

print (df)
   subject_id  hour  value
0           2     1     23 <- duplicate 2, 1
1           2     1     50 <- duplicate 2, 1
2           2     3     15
3           2     5     28
4           2     6     11
5           3     4     18
6           3     6     22

Возможным решением является совокупность sum или mean вместо set_index:

mux = pd.MultiIndex.from_product([df['subject_id'].unique(), np.arange(1,7)],
                                  names=['subject_id','hour'])
df1 = df.groupby(['subject_id','hour']).sum().reindex(mux).reset_index()
print (df1)
    subject_id  hour  value
0            2     1   73.0
1            2     2    NaN
2            2     3   15.0
3            2     4    NaN
4            2     5   28.0
5            2     6   11.0
6            3     1    NaN
7            3     2    NaN
8            3     3    NaN
9            3     4   18.0
10           3     5    NaN
11           3     6   22.0

Деталь :

print (df.groupby(['subject_id','hour']).sum())
                 value
subject_id hour       
2          1        73
           3        15
           5        28
           6        11
3          4        18
           6        22

Или удаленные дубликаты:

mux = pd.MultiIndex.from_product([df['subject_id'].unique(), np.arange(1,7)],
                                  names=['subject_id','hour'])
df1 = (df.drop_duplicates(['subject_id','hour'])
         .set_index(['subject_id','hour'])
         .reindex(mux)
         .reset_index())
print (df1)
    subject_id  hour  value
0            2     1   23.0
1            2     2    NaN
2            2     3   15.0
3            2     4    NaN
4            2     5   28.0
5            2     6   11.0
6            3     1    NaN
7            3     2    NaN
8            3     3    NaN
9            3     4   18.0
10           3     5    NaN
11           3     6   22.0

Деталь :

print (df.drop_duplicates(['subject_id','hour']))
   subject_id  hour  value
0           2     1     23 <- duplicates are removed
2           2     3     15
3           2     5     28
4           2     6     11
5           3     4     18
6           3     6     22
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...