сводный фрейм данных в pandas? - PullRequest
2 голосов
/ 06 марта 2020
people1 trait1 YES
people1 trait2 YES
people1 trait3 NO
people1 trait4 RED
people2 trait1 NO
people2 trait2 YES
people2 trait4 BLACK

et c ..

Возможно ли из этой таблицы создать что-то вроде этого?

        trait1, trait2, trait3, trait4 ...
people1  YES     YES     NO      RED
people2  NO      YES     -       BLACK
people3  -        -      YES     BLUE

Файл слишком большой, чтобы сделать это в Excel, я пробовал в pandas, но я не могу найти помощь в этом случае. Я нашел функцию pd.pivot_table, но не могу создать работающий код. Я попробовал и получил различные ошибки (99% моя вина).

Может кто-нибудь объяснить мне, как использовать его в моем случае? Или, может быть, лучше, чем pandas .pivot? +

РЕДАКТИРОВАТЬ

I rebuild my frame:
1      'interpretation'     'trait'
p1           YES               t1
p1           BLACK             t2
p1           NO                t3
p2           NO                t1
p2           RED               t2
p2           NO                t3

И я использую предложение:

data1.pivot_table ( index = 1, columns = "name", values ​​= 'trait', aggfunc = ','. join, fill_value = '-').

И я получил:

TypeError: sequence item 0: expected str instance, float found

Если я изменю

data1.pivot_table (index = 1, columns = "trait", values ​​= 'value', aggfunc = ','. Join, fill_value = '-').

Я получил неверную таблицу заказов, но без ошибок:

     p1      p2    p3    p4
YES  trait1  t1
YES  t1      t2 etc.
NO
RED
No
...

Так что я думаю, первый вариант правильный, но я не могу исправить эту ошибку. Когда я dtype df, он возвращает (O) для всех столбцов.

1 Ответ

2 голосов
/ 06 марта 2020

Я думаю, что проблема в пропущенных значениях в столбце trait, поэтому функция join не выполнена. Таким возможным решением является замена отсутствующих значений на пустые строки:

print (data1)
    1   name trait
0  p1    YES   NaN <- missing value
1  p1  BLACK    t2
2  p1     NO    t3
3  p2     NO    t1
4  p2    RED    t2
5  p2     NO    t3

data1['trait'] = data1['trait'].fillna('')
df = data1.pivot_table(index=1, 
                       columns="name", 
                       values='trait', 
                       aggfunc=','.join, 
                       fill_value='-')
print (df)
1      p1     p2
name            
BLACK  t2      -
NO     t3  t1,t3
RED     -     t2
YES            -

Также, если вы хотите преобразовать индекс в столбец:

data1['trait'] = data1['trait'].fillna('')
df = (data1.pivot_table(index=1, 
                       columns="name", 
                       values='trait', 
                       aggfunc=','.join, 
                       fill_value='-')
           .reset_index()
           .rename_axis(None, axis=1))
print (df)
    name  p1     p2
0  BLACK  t2      -
1     NO  t3  t1,t3
2    RED   -     t2
3    YES          -
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...