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