让我们说我有以下代码:
=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,但仍然无法做到这一点。
答案 0 :(得分:0)
好的,从那个起点开始,你首先要再次呼叫reset_index
:
df.reset_index(drop=True)
现在,索引中只应有一个级别,列A
,B
,C
,D
和dataframe
。
现在按dataframe
列进行转换:
df_pivot = df.pivot(columns='dataframe')
您现在拥有一个包含分层索引列的数据框,您可以滚动浏览并在顶部看到A
,B
,C
和D
等级,df1
和df2
就在下面。
如果您只想探索数据,那么它最好停在那里。您可以在不重命名列的情况下以自然的方式进行索引,并且可以通过水平滚动来轻松浏览数据。要索引A
和df1
值,您需要写:
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