2013-04-26 42 views
3

我有以下數據框:從多元組列拖放一個元組

<bound method DataFrame.info of <class 'pandas.core.frame.DataFrame'> 
MultiIndex: 369416 entries, (datetime.datetime(2008, 1, 2, 16, 0), 'ABC') to  (datetime.datetime(2010, 12, 31, 16, 0), 'XYZ') 
Data columns: 
b_val 369416 non-null values 
dtypes: float64(1)> 

由此,我想有日期爲指標和「ABC」到「XYZ」與列名的數據幀該值作爲「b_val」列下的值。我試圖做的:

new_data = new_data.unstack() 

但是這給了我:

<bound method DataFrame.info of <class 'pandas.core.frame.DataFrame'> 
Index: 757 entries, 2008-01-02 16:00:00 to 2010-12-31 16:00:00 
Columns: 488 entries, ('b_val', 'ABC') to ('b_val', 'XYZ') 
dtypes: float64(488)> 

有沒有辦法來改變這個法子還是有辦法從每列名的下降「b_val」?

回答

2

我認爲unstack是做你所做的事情的正確方法。

你可以使用droplevel下降從列名(一個多指標)的第一級:

df.columns = df.columns.droplevel(0) 

下面是一個例子:

df = pd.DataFrame([[1, 'a', 22], [1, 'b', 27], [2, 'a', 35], [2, 'b', 56]], columns=['date', 'name', 'value']).set_index(['date','name']) 
df1 = df.unstack() 

In [3]: df1 
Out[3]: 
     value 
name  a b 
date 
1  22 27 
2  35 56 

In [4]: df1.columns = df1.columns.droplevel(0) 

In [5]: df1 
Out[5]: 
name a b 
date 
1  22 27 
2  35 56 

但是,一個更簡便的方法就是到unstack列(系列):

In [6]: df.value.unstack() 
Out[6]: 
name a b 
date 
1  22 27 
2  35 56 
+0

謝謝,安迪!我在一個點上嘗試了水滴(0),但是我將結果分配給df而不是df.columns,並以col col名稱作爲數據框結束。沒有看到發生了什麼: -/ – pynewbie 2013-04-27 02:47:33

+0

@pynewbie現在我想起來,摧毀*系列*是一種「乾淨」的方式來做到這一點。我一直保存在水滴(因爲這回答了標題中的問題):) – 2013-04-27 10:39:38