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

gt6*_*89b 75 python pivot python-2.7 pandas

我有一个像元组的列表

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

我想将它们放入一个pandas DataFrame中,其中第一列命名的行和第二列命名的列.似乎照顾行名称的方式是类似pandas.DataFrame([x[1:] for x in data], index = [x[0] for x in data])但是如何处理列以获得2x2矩阵(前一组的输出是3x4)?是否有更智能的方式来处理行标签,而不是明确省略它们?

编辑似乎我需要2个DataFrames - 一个用于平均值,一个用于标准偏差,这是正确的吗?或者我可以在每个"单元格"中存储值列表吗?

Rom*_*kar 64

您可以在创建后转动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
Run Code Online (Sandbox Code Playgroud)

  • 索引为"0"的行和名为"1"的列不是很漂亮...... (3认同)

ely*_*ely 45

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

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'])
Run Code Online (Sandbox Code Playgroud)

然后说它更直观一些

df.set_index(['R_Number', 'C_Number']).Avg.unstack(level=1)
Run Code Online (Sandbox Code Playgroud)

这种方式暗示您正在寻求重塑平均值或标准偏差.然而,仅仅使用pivot它,它纯粹基于列约定,关于你正在重塑什么语义实体.

  • 是的.堆叠数据更好.想象一下关系数据库表,就像在SQL中一样.你不要把整个列吹成一堆重复的列吗?这应该只在特殊情况下发生(我认为这是从高到宽的模式).通常,您将多个列视为索引,并通过部分绑定其中一个索引列来进行选择,或者将它们全部绑定以获取特定记录. (2认同)
  • 因此,在您的情况下,在将索引设置为"[R_Number,C_Number]"之后,您可以执行`df.ix [('r1','c2')]`.或者您可以将它们保留为常规列并使用逻辑索引:`df [(df.R_Number =='r1')&(df.C_Number =='c2')]` (2认同)
  • 一般来说,使用`pivot`做的事情的主要用例是当你格式化某个表以便它可以很好地打印到屏幕上,或者很好地导出到HTML,LaTeX或.csv,或者一些东西.就像格式化将进入演示文稿或文章提交的表格一样.否则,就有效地操作数据而言,您希望在可能的情况下(比如数据库表的键)或至少作为重复的列,使得事物成为多索引,这样您就可以进行有效的索引和连接等.但是,您不需要想把它们吹进自己的专栏. (2认同)

Mar*_*oma 32

这是我在谈到这个问题时所期望的:

#!/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)
Run Code Online (Sandbox Code Playgroud)

         a  b  c  d
India    1  2  3  4
France   5  6  7  8
England  9  0  1  2
Germany  3  4  5  6
Run Code Online (Sandbox Code Playgroud)

  • @ gt6989b不,我没有.我没有尝试回答原始问题,而是人们(可能)在访问此页面时遇到的问题. (10认同)
  • @MartinThoma谢谢,这确实是我在这个页面上寻找的东西. (8认同)