转换为具有水平显示的多索引数据框并重命名列

时间:2016-06-22 18:54:29

标签: python python-2.7 pandas dataframe multi-index

让我们说我有以下代码:

=IF(J4>INDEX(Sheet2!J:J,MATCH(Sheet1!F4,Sheet2!B:B,FALSE),1),"O",IF(J4>INDEX(Sheet2!I:I,MATCH(Sheet1!F4,Sheet2!B:B,FALSE),1),"OW",IF(J4>INDEX(Sheet2!G:G,MATCH(Sheet1!F4,Sheet2!B:B,FALSE),1),"N",IF(J4>INDEX(Sheet2!E:E,MATCH(Sheet1!F4,Sheet2!B:B,FALSE),1),"W",IF(J4>INDEX(Sheet2!C:C,MATCH(Sheet1!F4,Sheet2!B:B,FALSE),1),"SW","")))))

这将返回一个包含2个索引级别的数据框,' dataframe'和'指数'我不确定正确的术语是什么,但在视觉上,第一个索引跨越行而不是列。

我想在这个数据帧上执行2个操作,我正在努力解决这个问题。

1)我想重命名每个"子数据帧中的列"从不同的列表中获取不同的东西,并根据先前分配的第一个索引相应地应用它们。我试过以下但如果我显示" df"它不起作用。再次:

df1 = pd.DataFrame(np.random.randn(10,4), columns=['A','B','C','D'])
df1['dataframe'] = 'df1'
df2 = pd.DataFrame(np.random.randn(10,4), columns=['A','B','C','D'])
df2['dataframe'] = 'df2'
df = pd.concat([df1, df2])
df.reset_index().set_index(['dataframe','index'])

所以,要明确的是,而不是A,B,C,D我喜欢df1_A ... df1_D和df2_A ...... df2_D

2)我想重新定位这个数据帧,使它们跨越列,所以我会滚动浏览每个"子数据帧"而不是上下。

我已经咨询过pandas API,但仍然无法做到这一点。

2 个答案:

答案 0 :(得分:0)

好的,从那个起点开始,你首先要再次呼叫reset_index

df.reset_index(drop=True)

现在,索引中只应有一个级别,列ABCDdataframe

现在按dataframe列进行转换:

df_pivot = df.pivot(columns='dataframe')

您现在拥有一个包含分层索引列的数据框,您可以滚动浏览并在顶部看到ABCD等级,df1df2就在下面。

如果您只想探索数据,那么它最好停在那里。您可以在不重命名列的情况下以自然的方式进行索引,并且可以通过水平滚动来轻松浏览数据。要索引Adf1值,您需要写:

df_pivot['A']['df1']

这是一种自然语法。但是如果你确实想要添加下划线,你可以这样添加它们:

df_pivot.columns = ['_'.join(col[::-1]).strip() for col in df_pivot.columns.values]

由于数据透视表的列由MultiIndex表示,df_pivot.columns.values返回一个元组数组。每个元组都类似('A','df1'),所以如果你想要df1_A形式的列名,你需要{I}添加[::1],这样你才能加入元组成员订购。如果您对列名称的其他订单(A_df1)感到满意,那么您可以删除相反的步骤:

df_pivot.columns = ['_'.join(col).strip() for col in df_pivot.columns.values]

答案 1 :(得分:0)

使用原始代码段生成的dataframe,我们可以根据它们所属的dataframes创建两个单独的dataframe,然后从这两个列中删除"dataframe"列。然后,我们将新列名分配给两个数据帧的每个columns属性。最后,我们将df2列名称列表传递到df1,由于它不存在,pandas会创建新列,我们会分配df2个值这些新专栏。

编辑:有一行从pandas cookbook

创建列多索引
df1 = df[df["dataframe"] == "df1"].copy().drop("dataframe",axis = 1)
df2 = df[df["dataframe"] == "df2"].copy().drop("dataframe", axis = 1)
df1.columns = ["df1_" + df1.columns]
df2.columns = ["df2_" + df2.columns]
df1[df2.columns] = df2
df1.columns = pd.MultiIndex.from_tuples([tuple(c.split('_')) for c in df1.columns]); 
print df1

输出(新):

        df1                                     df2                      \
          A         B         C         D         A         B         C   
0 -0.228363  0.675313 -0.076193 -0.805547  0.920632  0.789152  0.275401   
1  0.145603  0.422236  0.623796  0.233534  2.338283 -1.033269 -0.334333   
2 -0.526696  0.307727  0.478437 -0.068488 -0.475583 -0.802997 -0.059091   
3 -1.676880 -0.272451 -0.777794  0.490290  1.456024  0.340962 -0.436860   
4  1.203065 -0.198686 -1.065447  1.188931 -1.140757  0.046975 -2.596953   
5 -0.603939  0.734130 -0.321634  0.150161  2.228873  0.748693 -0.300975   
6  1.028938  0.114437  0.268499  0.260428 -1.896507  0.136147  0.004577   
7 -1.329070 -0.901562 -1.401573  0.715426 -1.711233  0.420301  0.643113   
8  2.033646 -0.550192  1.532104 -1.196995 -0.004135 -1.334320  0.110115   
9 -0.818145 -1.240037  0.880706 -0.625155 -0.672653  0.365357 -0.864840   


          D  
0 -0.888626  
1 -0.952065  
2  0.249387  
3  0.952315  
4 -1.804463  
5 -0.428231  
6 -0.257906  
7  1.551899  
8  0.054855  
9  0.679394