Pandas датафрейм заполнен "NaN", неправильные значения - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь переформатировать pandas фрейм данных, как показано ниже. Однако вместо значений из исходного фрейма данных появляются NaN. Код: df = df.T.reindex(subjects)

Из этого:

                        rating_per_subject
1  {'P1': **4**, 'P2': **1**, 'T1': **2**, 'S1': **5**, 'S2': **5**, ...
2  {'P1': 1, 'P2': 1, 'T1': 5, 'S1': 1, 'S2': 1, ...
3  {'P1': 3, 'P2': 2, 'T1': 4, 'S1': 5, 'S2': 4, ...
4  {'P1': 2, 'P2': 5, 'T1': 5, 'S1': 4, 'S2': 5, ...

В этот формат:

      1      2    3     4
P1  **NaN**  NaN  NaN  NaN
P2  **NaN**  NaN  NaN  NaN
T1  **NaN**  NaN  NaN  NaN
S1  **NaN**  NaN  NaN  NaN
S2  **NaN**  NaN  NaN  NaN
R1  **NaN**  NaN  NaN  NaN
R2  **NaN**  NaN  NaN  NaN

1 Ответ

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

Для создания исходного DataFrame I:

  1. Создан следующий список словарей:

    tbl = [ {'P1': '**4**', 'P2': '**1**', 'T1': '**2**', 'S1': '**5**', 'S2': '**5**'},
            {'P1':    1,    'P2':    1,    'T1':    5,    'S1':    1,    'S2':    1},
            {'P1':    3,    'P2':    2,    'T1':    4,    'S1':    5,    'S2':    4},
            {'P1':    2,    'P2':    5,    'T1':    5,    'S1':    4,    'S2':    5}]
    

    Обратите внимание, что значения в первой строке прилагаются в кавычках (в отличие от вашего образца), в противном случае был бы неверный синтаксис.

  2. Создан фрейм данных:

    df = pd.DataFrame({'rating_per_subject': tbl})
    

Обратите внимание, что пока ваш DataFrame содержит столбец single . Но так как ваш код содержит вызов атрибута T (преобразование), исходный DataFrame должен иметь форму "true-2D", то есть он должен содержать несколько строк и столбцов.

На мой взгляд, пропущенный шаг - разбить каждую строку на столбцы, то есть ключи словаря следует преобразовать в имена столбцов, а значения словаря - в значения столбцов.

Вы можете сделать это, выполнив:

df2 = df.rating_per_subject.apply(pd.Series)

что дает:

      P1     P2     T1     S1     S2
0  **4**  **1**  **2**  **5**  **5**
1      1      1      5      1      1
2      3      2      4      5      4
3      2      5      5      4      5

Теперь, когда вы транспонируете этот DataFrame (прогон df2.T), вы получите:

        0  1  2  3
P1  **4**  1  3  2
P2  **1**  1  2  5
T1  **2**  5  4  5
S1  **5**  1  5  4
S2  **5**  1  4  5

Предположим, что subjects = ['P1', 'P2', 'T1', 'S1', 'S2', 'R1', 'R2'].

Когда вы запустите df2.T.reindex(subjects), вы получите:

        0    1    2    3
P1  **4**    1    3    2
P2  **1**    1    2    5
T1  **2**    5    4    5
S1  **5**    1    5    4
S2  **5**    1    4    5
R1    NaN  NaN  NaN  NaN
R2    NaN  NaN  NaN  NaN

Может быть, это то, что вы ищете?

...