我有一个 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']
但我认为 Pandas 可以更有效地做到这一点。
有什么想法吗?
最佳答案
正如 @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 调用。
关于python - 将数据分散到多个列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26101246/