从(row,col,values)元组列表构建pandas DataFrame

88

我有一个类似于元组的列表

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

编辑,看起来我需要两个DataFrame-平均值和标准差分别存储,对吗?或者我可以在每个“单元格”中存储值列表吗?


1
这是一个明显的重复问题,链接为https://dev59.com/1Ggu5IYBdhLWcg3wUlft?rq=1。 - ely
2
@EMS根本不需要。我看到了那个问题,他不需要2D旋转。 - gt6989b
1
@ely,gt6989b,我更改了标题为“...从(行、列、值)元组列表中提取”,以明确这与“...从元组中提取”不同。 - smci
将元组列表转换为数据框的方法: - doubts
3个回答

70

在创建后,您可以对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

3
索引为0且列名为1的行不太美观... - drevicko

51

我认为最好保留数据的当前结构:

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

37

当我来到这个问题时,我期待看到的就是这样:

#!/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

你把问题看错了。问题中最初给出的数据已经为每个记录提供了行和列标签。 - gt6989b
11
@gt6989b 不,我没有。我没有试图回答原始问题,而是回答人们来到这个页面时可能会有的问题。 - Martin Thoma
8
谢谢,确实这就是我在这个页面上寻找的。 - ssword
我也确实期望这样 - cikatomo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接