2013-11-13 3 views
53

У меня есть список кортежей, какConstruct панда DataFrame из списка кортежей (строка, столбец, значение)

data = [ 
('r1', 'c1', avg11, stdev11), 
('r1', 'c2', avg12, stdev12), 
('r2', 'c1', avg21, stdev21), 
('r2', 'c2', avg22, stdev22) 
] 

, и я хотел бы, чтобы поместить их в панде DataFrame с рядами названных в первой колонке и столбцы, названные вторым столбцом. Кажется, что способ позаботиться о именах строк - это что-то вроде pandas.DataFrame([x[1:] for x in data], index = [x[0] for x in data]), но как мне позаботиться о столбцах, чтобы получить матрицу 2x2 (выход из предыдущего набора - 3x4)? Есть ли более разумный способ позаботиться о ярлыках строк, а не явно опускать их?

EDIT Кажется, мне понадобятся 2 DataFrames - один для средних и один для стандартных отклонений, это правильно? Или я могу сохранить список значений в каждой «ячейке»?

+1

выдержка дубликата ely

+1

@EMS совсем нет. Я видел этот вопрос, ему не нужен 2D-поворот. – gt6989b

+0

Я не согласен - я думаю, вы просто не знакомы с правильным способом стека данных в DataFrame. Как правило, вы хотите использовать информацию в * оба * свой столбец 1 и столбец 2 в качестве индексов, чтобы вы могли быстро искать данные. Вещи в столбце 2 не относятся к именам столбцов, но даже если они это делают, это совершенно отдельный вопрос, чем заголовок вашего сообщения. Я предполагаю, что редактирование названия может помочь (хотя я все еще думаю, что это не вопрос, имеющий существенно иной характер). – ely

ответ

51

Вы можете повернуть свой DataFrame после создания:

>>> df = pd.DataFrame(data) 
>>> df.pivot(index=0, columns=1, values=2) 
# avg DataFrame 
1  c1  c2 
0    
r1 avg11 avg12 
r2 avg21 avg22 
>>> df.pivot(index=0, columns=1, values=3) 
# stdev DataFrame 
1  c1  c2 
0     
r1 stdev11 stdev12 
r2 stdev21 stdev22 
+1

Строка с индексом '0' и столбец с именем' 1' не очень красивы ... – drevicko

33

Я утверждаю, что лучше оставить ваши данные сложены, как это:

df = pandas.DataFrame(data, columns=['R_Number', 'C_Number', 'Avg', 'Std']) 

# Possibly also this if these can always be the indexes: 
# df = df.set_index(['R_Number', 'C_Number']) 

Тогда это немного более интуитивным сказать

df.set_index(['R_Number', 'C_Number']).Avg.unstack(level=1) 

Таким образом, подразумевается, что вы хотите изменить средние значения или стандартные отклонения дополнения. Принимая во внимание, что, используя pivot, это чисто основано на соглашении столбцов относительно того, какой семантический объект он переделывает.

+1

+1, полезная экспликация. Я явно заинтересован в 2D-таблице - чтобы я мог искать значения, индексированные как списками строк, так и столбцов, а также получать доступ к каждому из измерений отдельно. Можете ли вы сделать это со сложными данными? – gt6989b

+2

Да. Гораздо лучше с накопленными данными. Подумайте о таблице реляционных баз данных, как в SQL. Вы не собираетесь выдувать целую колонку в кучу повторяющихся столбцов? Это должно произойти только в особых случаях (я думаю, что это шаблон с высоким по ширине). Как правило, вы обрабатываете несколько столбцов в качестве индексов и делаете выбор, частично связывая один из столбцов индекса или связывая их все, чтобы получить определенную запись. – ely

+2

Итак, в вашем случае, после установки индекса как '[R_Number, C_Number]' вы можете сделать, например, 'df.ix [('r1', 'c2')]' '. Или вы можете оставить их как обычные столбцы и использовать логическое индексирование: 'df [(df.R_Number == 'r1') & (df.C_Number == 'c2')] ' – ely

3

Это то, что я ожидал увидеть, когда я пришел на этот вопрос:

#!/usr/bin/env python 

import pandas as pd 


df = pd.DataFrame([(1, 2, 3, 4), 
        (5, 6, 7, 8), 
        (9, 0, 1, 2), 
        (3, 4, 5, 6)], 
        columns=list('abcd'), 
        index=['India', 'France', 'England', 'Germany']) 
print(df) 

дает

  a b c d 
India 1 2 3 4 
France 5 6 7 8 
England 9 0 1 2 
Germany 3 4 5 6 
+0

Вы неправильно поняли вопрос. Первоначально данные, заданные в вопросе, уже имеют метки строк и столбцов для каждой записи. – gt6989b

+1

@ gt6989b Нет, я этого не делал. Я не пытался ответить на исходный вопрос, но вопрос, который может возникнуть у людей (возможно), когда они придут на эту страницу. –

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