2013-07-08 106 views
0

我想使圖的以下表示(邊緣從n1n2)是對稱的,這意味着我想複製交換節點的DataFrame的每一行。交換索引列的Pandas DataFrame的重複行

數據準備(實際上,我導入此從具有固定結構的電子表格):

import pandas as pd 
df = pd.DataFrame({'n1':[1,1,2], 
        'n2':[2,3,4], 
        'L':[10,20,40], 
        'D':[5,6,7]}) 
df = df.set_index(['n1','n2']) 

前:

 D L 
n1 n2 
1 2 5 10 
    3 6 20 
2 4 7 40 

後:

 D L 
n1 n2 
1 2 5 10 
    3 6 20 
2 4 7 40 
    1 5 10 
3 1 6 20 
4 2 7 40 

回答

1

一個簡單的方法是複製df並自己反轉索引,然後將兩者附加在一起。

df2 = df1 
df2.index.names = ['n2','n1'] 
df2 = df2.reorder_levels(['n1','n2']) 

df1.append(df2) 

     D L 
n2 n1  
1 2 5 10 
    3 6 20 
2 4 7 40 
    1 5 10 
3 1 6 20 
4 2 7 40 
+0

正是我需要的,謝謝。 'df2 = df1'和'df2 = df1.copy()'有區別嗎? – ojdo

+1

在第一種情況下,df2和df1是兩個相同的對象。在第二種情況下,它們是不同的。你可以通過檢查'id(df)'和'id(df2)' – waitingkuo

+0

來檢查它。在這種情況下,似乎我需要copy()來防止修改原始索引標籤。我想要結果有(n1,n2)索引,而不是(n2,n1)。我建議編輯。 – ojdo

0

不是一個答案,而是爲了說明上述討論一下:

DF1:

print df1 

     D L 
n1 n2  
1 2 5 10 
    3 6 20 
2 4 7 40 

df2 = df1.copy() 

# these have the same result: 
# df2 = pd.DataFrame(df1) 
# df2 = copy.copy(df1) 

df2.index.names = ['n2','n1'] 
df2.columns =['X','Y'] 
df2 = df2 * 3 

DF2:

print df2 

     X Y 
n2 n1   
1 2 15 30 
    3 18 60 
2 4 21 120 

DF1:

print df1 

     D L 
n2 n1  
1 2 5 10 
    3 6 20 
2 4 7 40 
相關問題