我有一个像这样的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
我的第一个想法是使用
创建一个新的DataFramedf2 = 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']
但我认为熊猫可以更有效地做到这一点。
有什么想法吗?
答案 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中调用。