2014-02-13 2 views
0

У меня есть следующий dataframe:Преобразование панды DataFrame в список Python

In [137]: counts 
Out[137]: 
SourceColumnID     3029903181 3029903182 3029903183 3029903184 ResponseCount 
ColID  QuestionID RowID                  
3029903193 316923119 3029903189   773   788   778   803   3142 
3029903194 316923119 3029903189   766   799   782   773   3120 

[2 rows x 5 columns] 

, который хорошо работает для того, что я хочу, когда я к нему доступ через iloc:

In [138]: counts.iloc[0][3029903181] 
Out[138]: 773 

но когда я преобразовать это Сыроватского форматирует его в пути, который не доступен так же больше:

In [139]: counts.to_dict() 
Out[139]: 
{3029903181: {(3029903193, 316923119, 3029903189): 773, 
    (3029903194, 316923119, 3029903189): 766}, 
3029903182: {(3029903193, 316923119, 3029903189): 788, 
    (3029903194, 316923119, 3029903189): 799}, 
3029903183: {(3029903193, 316923119, 3029903189): 778, 
    (3029903194, 316923119, 3029903189): 782}, 
3029903184: {(3029903193, 316923119, 3029903189): 803, 
    (3029903194, 316923119, 3029903189): 773}, 
'ResponseCount': {(3029903193, 316923119, 3029903189): 3142, 
    (3029903194, 316923119, 3029903189): 3120}} 

In [140]: counts.to_dict('list') 
Out[140]: 
{3029903181: [773, 766], 
3029903182: [788, 799], 
3029903183: [778, 782], 
3029903184: [803, 773], 
'ResponseCount': [3142, 3120]} 

Мне нужно преобразовать это структура данных в стан dard python, чтобы вернуть API для его использования.

Должен ли я создать таблицу в другом формате?

Я начал с этим DataFrame:

In [141]: df 
Out[141]: 
     ColID QuestionID ResponseCount  RowID SourceColumnID 
0 3029903193 316923119   773 3029903189  3029903181 
1 3029903193 316923119   788 3029903189  3029903182 
2 3029903193 316923119   778 3029903189  3029903183 
3 3029903193 316923119   803 3029903189  3029903184 
4 3029903194 316923119   766 3029903189  3029903181 
5 3029903194 316923119   799 3029903189  3029903182 
6 3029903194 316923119   782 3029903189  3029903183 
7 3029903194 316923119   773 3029903189  3029903184 

[8 rows x 5 columns] 

и превратили его в сводную таблицу, как это:

counts = df.pivot_table(values='ResponseCount', rows=['ColID', 'QuestionID', 'RowID'], cols='SourceColumnID', aggfunc='sum') 

Я действительно ищет структура данных, чтобы выйти из вида:

[ 
    { 
    'QuestionID': 316923119, 
    'RowID': 3029903189, 
    'ColID': 3029903193, 
    '3029903181': 773, 
    '3029903182': 788, 
    '3029903183': 778, 
    '3029903184': 803, 
    'ResponseCount': 3142 
    }, 
    { 
    'QuestionID': 316923119, 
    'RowID': 3029903189, 
    'ColID': 3029903194, 
    '3029903181': 766, 
    '3029903182': 799, 
    '3029903183': 782, 
    '3029903184': 773, 
    'ResponseCount': 3120 
    }, 
] 

ответ

2

Я считаю, что вы хотите counts.reset_index().to_dict('records').

Используя 'records' с to_dict, он дает вам список dicts, по одному dict в строке, который вы хотите. Вам нужно использовать reset_index(), чтобы получить индексную информацию в виде столбцов (потому что «записи» отбрасывают индекс). По идее, вы говорите, что хотите не различать то, что находится в индексе вашей сводной таблицы, и то, что находится в столбцах (вы просто хотите, чтобы все индексные метки и в качестве ключей в dict), поэтому вам нужно, чтобы reset_index удалите различие индекса/столбца.

+0

Nice, that works. Почему нужно сбросить индекс? Будет ли смысл создавать сводную таблицу по-другому? – sontek

+0

@sontek: Я отредактировал свой ответ, чтобы объяснить, почему индекс нужно сбросить. Я не думаю, что есть необходимость создавать сводную таблицу по-разному; просто сбросьте индекс. Вам просто нужна информация в столбцах, когда сводная таблица предоставляет ее вам в индексе. – BrenBarn

Смежные вопросы