Построить pandas DataFrame из списка кортежей
У меня есть список кортежей типа
data = [
('r1', 'c1', avg11, stdev11),
('r1', 'c2', avg12, stdev12),
('r2', 'c1', avg21, stdev21),
('r2', 'c2', avg22, stdev22)
]
и я хотел бы поместить их в pandas DataFrame со строками, названными первым столбцом и столбцами, названными вторым столбцом. Кажется, что способ позаботиться о именах строк - это что-то вроде pandas.DataFrame([x[1:] for x in data], index = [x[0] for x in data])
, но как мне позаботиться о столбцах, чтобы получить матрицу 2x2 (выход из предыдущего набора - 3x4)? Есть ли более разумный способ заботиться о ярлыках строк, а не явно опускать их?
EDIT Кажется, мне понадобятся 2 DataFrames - один для средних и один для стандартных отклонений, верно? Или я могу сохранить список значений в каждой "ячейке"?
Ответы
Ответ 1
Вы можете повернуть свой 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
Ответ 2
Я утверждаю, что лучше оставить ваши данные сложными, как есть:
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
, это чисто основано на согласии с столбцом относительно того, какой семантический объект он переделывает.
Ответ 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