跨多个列传播数据

时间:2014-09-29 13:36:33

标签: python pandas

我有一个像这样的Pandas DataFrame 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

我想构建一个具有唯一索引的新DataFrame 并且每个数据有一列。

类似于df2

            temp      p
2014-01-01  10.0  101.0
2014-01-02  11.5  100.0

我的第一个想法是使用

创建一个新的DataFrame
df2 = pd.DataFrame(index=df.index.unique(), columns=df['name'].unique())

并使用for循环填充此DataFrame

for col in df['name'].unique():
    df2[col] = df[df['name']==col]['value']

但我认为熊猫可以更有效地做到这一点。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

正如@scls在下面的评论中所指出的,当使用pivot对索引中包含重复条目的DataFrame执行此操作时,pandas中可能存在错误。

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

df.pivot(columns='name', index=df.index)['value']

编辑:下面的答案似乎不适用于索引中的重复条目,与pandas文档进行比较时似乎是一个错误,其中如果省略index,则表示现有的唯一元素将使用索引。

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

原始答案:使用pandas.DataFrame pivot function中提供的工具来转动您要用作类别的列。

>>> 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')

也可以选择使用function pivot_table直接在pandas模块顶级命名空间中完成此操作,如:

pandas.pivot_table(df, ...)

如果您不想直接从正在测试的DataFrame中调用。