84

我有一个像这样的元组列表

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)?是否有一种更智能的方式来处理行标签,而不是明确地忽略它们?

编辑似乎我需要 2 个数据帧 - 一个用于平均值,一个用于标准偏差,对吗?或者我可以在每个“单元格”中存储一个值列表吗?

4

3 回答 3

66

您可以在创建后旋转您的 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
于 2013-11-13T18:28:06.063 回答
50

我认为最好将您的数据保持原样:

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,它完全基于列约定,即您正在重塑的语义实体是什么。

于 2013-11-13T18:44:56.647 回答
38

当我提出这个问题时,这是我期望看到的:

#!/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
于 2017-11-29T07:21:20.057 回答