Python 将数据分散到多个列中

Python 将数据分散到多个列中,python,pandas,Python,Pandas,我有一个熊猫数据帧df,如下所示: name value 2014-01-01 temp 10.0 2014-01-01 p 101.0 2014-01-02 temp 11.5 2014-01-02 p 100.0 我想构建一个具有唯一索引的新数据框架 每个数据有一列 类似于df2: 我的第一个想法是使用 df2 = pd.DataFrame(index=df.index.unique(), columns=df['name'].un

我有一个熊猫数据帧df,如下所示:

            name  value
2014-01-01  temp   10.0
2014-01-01     p  101.0
2014-01-02  temp   11.5
2014-01-02     p  100.0
我想构建一个具有唯一索引的新数据框架 每个数据有一列

类似于df2:

我的第一个想法是使用

df2 = pd.DataFrame(index=df.index.unique(), columns=df['name'].unique())
并使用for循环填充此数据帧

for col in df['name'].unique():
    df2[col] = df[df['name']==col]['value']
但我认为熊猫可以更有效地做到这一点


有什么想法吗?

正如@SCL在下面的评论中指出的,当使用pivot对索引中有重复项的数据帧执行此操作时,pandas中可能存在错误

您需要在此处使用修改后的版本才能使其正常工作:

df.pivot(columns='name', index=df.index)['value']
编辑:下面的答案似乎不适用于索引中的重复条目,与pandas文档相比,这似乎是一个缺陷,因为pandas文档表示,如果省略索引,将使用现有索引的唯一元素

这也是有问题的,因为在这种情况下,使用set_索引然后取消堆栈将非常繁琐,因为一个可能的索引级别已经是索引,而另一个则不是。我们希望将名称附加到索引中,而不需要首先弹出未命名的现有索引,这可以完成,但会导致恼人的、不可读的语法

原始答案:使用pandas.DataFrame中提供的工具,以要用作类别的列为轴心

>>> df.pivot(columns='name', values='value')
>>> 
variable    temp      p        

2004-01-01  10.0  101.0
2004-01-02  11.5  100.0
如果遇到与索引相关的错误,请尝试将索引添加为透视的一部分:

df.pivot(index=df.index, columns='name', values='value')
这也可以通过直接在pandas模块顶级命名空间中实现,如中所示:

pandas.pivot_table(df, ...)

如果您不想直接从测试中的数据帧调用。

正如@scls在下面的评论中指出的,当使用pivot对索引中有重复项的数据帧执行此操作时,pandas中可能存在错误

您需要在此处使用修改后的版本才能使其正常工作:

df.pivot(columns='name', index=df.index)['value']
编辑:下面的答案似乎不适用于索引中的重复条目,与pandas文档相比,这似乎是一个缺陷,因为pandas文档表示,如果省略索引,将使用现有索引的唯一元素

这也是有问题的,因为在这种情况下,使用set_索引然后取消堆栈将非常繁琐,因为一个可能的索引级别已经是索引,而另一个则不是。我们希望将名称附加到索引中,而不需要首先弹出未命名的现有索引,这可以完成,但会导致恼人的、不可读的语法

原始答案:使用pandas.DataFrame中提供的工具,以要用作类别的列为轴心

>>> df.pivot(columns='name', values='value')
>>> 
variable    temp      p        

2004-01-01  10.0  101.0
2004-01-02  11.5  100.0
如果遇到与索引相关的错误,请尝试将索引添加为透视的一部分:

df.pivot(index=df.index, columns='name', values='value')
这也可以通过直接在pandas模块顶级命名空间中实现,如中所示:

pandas.pivot_table(df, ...)

如果您不想直接从测试中的数据帧调用。

我没有使用df.pivotcolumns='name',index=df.index['value'],因为您的代码不工作,所以无法使用null键标记索引。您使用的是哪个版本?0.14的文档说,索引是可选的,如果省略,将使用现有索引中的唯一值。pd.\uuuuu version\uuuuuu返回0.14是的,这看起来像一个bug。我相信在某个地方,当它查找指数时,它会耗尽它们。也就是说,一旦它使用了索引值,相同的值就不可用了。在一些文档和相关的其他SO问题中,一些pandas开发人员似乎试图通过说pivot是一个重塑操作来改变这一点,而不是改变索引。但这并不是一个令人满意的解释:当从重复的索引项转换为加宽的列版本时,重塑正是人们试图做的。我做了df.pivotcolumns='name',index=df.index['value'],因为你的代码不起作用,所以不能用空键标记索引。你使用的是哪个版本?0.14的文档说,索引是可选的,如果省略,将使用现有索引中的唯一值。pd.\uuuuu version\uuuuuu返回0.14是的,这看起来像一个bug。我相信在某个地方,当它查找指数时,它会耗尽它们。也就是说,一旦它使用了索引值,相同的值就不可用了。在一些文档和相关的其他SO问题中,一些pandas开发人员似乎试图通过说pivot是一个重塑操作来改变这一点,而不是改变索引。但这并不是一个令人满意的解释:当从重复的索引项转换为加宽的列版本时,重塑正是人们试图做的事情。