Pandas .Установка Python - PullRequest
       22

Pandas .Установка Python

0 голосов
/ 30 марта 2020

У меня есть данные, состоящие из нескольких медицинских измерений, проведенных в разные часы (от 1 до 12) и от разных пациентов Данные организованы по двум показателям: один соответствует номеру пациента (pid), а другой - времени измерений. Сами измерения находятся в столбцах.

Фрейм данных выглядит следующим образом:

            | Measurement1 |... |Measurement35
pid | Time  |              |    |
-------------------------------------------------------
1    1      | Meas1@T1,pid1|    |     Meas35@T1,pid1
     2      |  Meas@T2,pid1|    |     Meas35@T2,pid1
     3      |    ...       |    |           ...
     ...    |              |    |
     12.    |              |    |
            |              |    |
2    1.     | Meas1@T1,pid2|    |           ... 
     2.     |              |    |
     3.     |              |    |
     ...    |        ...   |    |
     12.    |              |    |
...         |              |    |
9999 1.     |              |    |           ...
     2.     |              |    |
     3.     |              |    |
     ...    |              |    |           ...
     12.    |              |    |


И что я хотел бы получить, так это один ряд для каждого пациента и один столбец для каждой комбинации времени. и измерение (поэтому строка pid содержит все данные, относящиеся к этому пациенту):

    |    Measurement1    |... |    Measurement35   |
pid | T1 | T2 | ... | T12|    |T1 | T2 | ... | T12 |
-------------------------------------------------------
1   |    |    |     |    |    |   |    |     |     |
2   |    |    |     |    |    |   |    |     |     |
... |    |    |     |    |    |   |    |     |     |
9999|    |    |     |    |    |   |    |     |     |

Я пытался использовать DF.pivot(index ='pid', columns='Time'), но я получаю 35 столбцов для каждого измерения вместо 12 необходимых мне столбцов. (и значения в этих 35 столбцах иногда сдвигаются). Аналогично работает с DF.unstack(1).

Чего мне не хватает?

1 Ответ

0 голосов
/ 30 марта 2020

Вам не хватает аргумента 'values' внутри df.pivot

# df example
df = {'pid':[1 for _ in range(12)]+[2 for _ in range(12)]+[3 for _ in range(12)],'Time':[x+1 for x in range(12)]+[x+1 for x in range(12)]+[x+1 for x in range(12)],'Measurement1':['val_time1',np.nan,'val_time3',np.nan,np.nan,np.nan,'val_time7','val_time8','val_time9',np.nan,np.nan,'val_time12']+['val_time1',np.nan,'val_time3',np.nan,np.nan,np.nan,'val_time7','val_time8','val_time9',np.nan,np.nan,'val_time12']+['val_time1',np.nan,'val_time3',np.nan,np.nan,np.nan,'val_time7','val_time8','val_time9',np.nan,np.nan,'val_time12'], 'Measurement2':['val_time1',np.nan,'val_time3',np.nan,np.nan,np.nan,'val_time7','val_time8','val_time9',np.nan,np.nan,'val_time12']+['val_time1',np.nan,'val_time3',np.nan,np.nan,np.nan,'val_time7','val_time8','val_time9',np.nan,np.nan,'val_time12']+['val_time1',np.nan,'val_time3',np.nan,np.nan,np.nan,'val_time7','val_time8','val_time9',np.nan,np.nan,'val_time12']}

Out:
        pid  Time Measurement1 Measurement2
0     1     1    val_time1    val_time1
1     1     2          NaN          NaN
2     1     3    val_time3    val_time3
3     1     4          NaN          NaN
4     1     5          NaN          NaN
5     1     6          NaN          NaN
6     1     7    val_time7    val_time7
7     1     8    val_time8    val_time8
8     1     9    val_time9    val_time9
9     1    10          NaN          NaN
10    1    11          NaN          NaN
11    1    12   val_time12   val_time12
12    2     1    val_time1    val_time1
13    2     2          NaN          NaN
14    2     3    val_time3    val_time3
15    2     4          NaN          NaN

Поворот, указывающий, что мы хотим использовать значения для обоих столбцов, Measurement1 и 2

df_pivoted = df.pivot(index='pid', columns='Time', values=['Measurement1','Measurement2'])

Out:
     Measurement1                       ... Measurement2                      
Time           1    2          3    4   ...           9    10   11          12
pid                                     ...                                   
1       val_time1  NaN  val_time3  NaN  ...    val_time9  NaN  NaN  val_time12
2       val_time1  NaN  val_time3  NaN  ...    val_time9  NaN  NaN  val_time12
3       val_time1  NaN  val_time3  NaN  ...    val_time9  NaN  NaN  val_time12

Проверка чтобы увидеть, есть ли у нас 12 подколонок для каждой группы измерений:

print(df_pivoted.columns.levels)

Out:
[['Measurement1', 'Measurement2'], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]
...