2014-09-29 29 views
1

我有一個熊貓數據幀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

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

我的第一個想法是使用

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

但我認爲熊貓可以更有效地做到這一點。

有什麼想法?

回答

3

正如@scls在下面的評論中指出的那樣,當使用pivot對索引中具有重複條目的DataFrame執行此操作時,熊貓可能會有一個錯誤。

您需要使用修改後的版本在這裏得到它的工作:

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

編輯:下面的答案似乎不在索引中,這似乎在對抗相比,是一個錯誤與重複項工作在熊貓文檔中,如果省略index,則將使用現有索引的獨特元素。

這也有問題,因爲在這種情況下,使用​​後跟unstack將是非常乏味的,因爲其中一個可能的索引級別已經是索引,而另一個則不是。我們希望將「name」附加到索引中,而不需要先將未命名的現有索引從那裏彈出,這可以完成,但會導致惱人的,無法讀取的語法。

原始回答:使用pandas.DataFramepivot 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中調用。

+0

我做了'df.pivot(columns ='name',index = df.index)['value']'因爲你的代碼不工作(不能用null鍵標記索引) – scls 2014-09-29 14:07:41

+0

你正在使用哪個版本? 0.14的文檔聲稱'index'是可選的,並且如果省略,則將使用來自現有索引的唯一值。 – ely 2014-09-29 14:08:44

+0

pd .__ version__返回0.14 – scls 2014-09-29 14:09:37