【问题标题】:Construct pandas DataFrame from list of tuples of (row,col,values)从 (row,col,values) 的元组列表构造 pandas DataFrame
【发布时间】:2013-11-26 12:13:27
【问题描述】:

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

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 个数据帧 - 一个用于平均值,一个用于标准偏差,对吗?或者我可以在每个“单元格”中存储一个值列表吗?

【问题讨论】:

  • stackoverflow.com/questions/11415701/… > 的明确副本
  • @EMS 根本没有。我看到了那个问题,他不需要二维旋转。
  • 我不同意——我认为您只是不熟悉在 DataFrame 中堆叠数据的正确方法。通常,您希望将第 1 列和第 2 列中的信息 both 用作索引,这样您就可以通过其中任何一个来快速搜索数据。第 2 列中的内容不属于列名,但即使它们属于,这也是一个与您的帖子标题完全不同的问题。我想编辑标题可能会有所帮助(尽管我仍然认为这不是一个有意义的不同问题)。
  • @ely, gt6989b 我将其重新命名为“...来自 (row,col,values) 的元组列表”以清楚说明为什么这不是重复 “...来自元组”

标签: python python-2.7 pandas pivot


【解决方案1】:

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

#!/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 不,我没有。我没有尝试回答最初的问题,而是人们(可能)在访问此页面时遇到的问题。
  • @MartinThoma 谢谢,这确实是我在此页面上寻找的内容。
  • 确实我也期待这个
【解决方案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,它完全基于列约定,即您正在重塑的语义实体是什么。

【讨论】:

  • +1,有用的明确性。我对 2D 表非常感兴趣——允许我搜索由行列表和列列表索引的值,以及分别访问每个维度。你能用堆积的数据做到这一点吗?
  • 是的。堆叠数据要好得多。想想一个关系数据库表,就像在 SQL 中一样。你不会把一整列炸成一堆重复的列吗?这应该只在特殊情况下发生(我认为这是从高到宽的模式)。通常,您将多个列视为索引,并通过部分绑定其中一个索引列或将它们全部绑定以获得特定记录来进行选择。
  • 因此,在您的情况下,在将索引设置为 [R_Number, C_Number] 之后,您可以执行 df.ix[('r1','c2')],例如。或者您可以将它们保留为常规列并使用逻辑索引:df[(df.R_Number == 'r1') & (df.C_Number == 'c2')]
  • 一般来说,使用pivot 做的事情的主要用例是当你正在格式化一些表格以便它很好地打印到屏幕上,或者很好地导出到 HTML 、LaTeX 或 .csv 或其他文件。就像格式化将进入演示文稿或文章提交的表格一样。否则,就有效地操作数据而言,您希望尽可能多索引(如数据库表的键)或至少作为重复列,以便您可以进行有效的索引和连接等。但你不想把它们炸成自己的专栏。
【解决方案3】:

您可以在创建后旋转您的 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

【讨论】:

  • 索引为0 的行和名称为1 的列不是很漂亮...
猜你喜欢
  • 2015-02-24
  • 1970-01-01
  • 2020-01-28
  • 2022-12-28
  • 2012-07-10
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
相关资源
最近更新 更多