2013-04-26 45 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