2016-01-22 161 views
0

我有一個熊貓數據框填寫使用索引元素,如下圖所示:重新索引數據幀;從多列

  I1  V1   I2  V2   I3  V3 ... 
0 13.823560 0.000000 13.639405 0.000000 13.455246 0.000000 ... 
1 13.823376 0.001274 13.639224 0.001273 13.455068 0.001272 ... 
2 13.823193 0.002547 13.639043 0.002546 13.454889 0.002544 ... 
3 13.823009 0.003821 13.638862 0.003819 13.454711 0.003817 ... 
4 13.822826 0.005095 13.638681 0.005092 13.454532 0.005089 ... 
5 13.822642 0.006368 13.638500 0.006365 13.454354 0.006361 ... 
...  ...  ...  ...  ...  ...  ... ... 
495 0.613282 0.630456 0.610912 0.630109 0.608497 0.629756 ... 
496 0.455202 0.631730 0.453456 0.631381 0.451677 0.631028 ... 
497 0.296663 0.633004 0.295533 0.632654 0.294383 0.632301 ... 
498 0.137670 0.634277 0.137149 0.633927 0.136619 0.633573 ... 
499 -0.021770 0.635551 -0.021688 0.635200 -0.021605 0.634845 ... 

[500 rows x 120 columns] 

我想要做的就是重塑數據幀,使它看起來像這樣:

#(I as new index) 
    I   V1   V2   V3   ... 
    13.823560 0.000000 NaN   NaN   ... 
    13.823376 0.001274 NaN   NaN   ... 
    13.823193 0.002547 NaN   NaN   ... 
    13.823009 0.003821 NaN   NaN   ... 
    13.822642 0.005095 NaN   NaN   ... 
    ...   ...   ...   ...   ... 
    0.137670 0.630456 NaN   NaN   ... 
    0.136619 NaN   NaN   0.633573 ... 
    -0.021605 NaN   NaN   0.634845 ... 
    -0.021688 NaN   0.635200 NaN   ... 
    -0.021770 0.635551 NaN   NaN   ... 

    [30000 rows x 60 columns] 

在換句話說,我想填充新的DataFrame索引,並在所有「I」標籤列(在我的情況下爲1到60)中遇到所有值。但是,我現在還想保留其餘的V-column,只要它們仍然鏈接到它們原來的I-valued值。

嘗試以下...

dfen = pd.melt(dfen, id_vars=['I'+str(b) for b in xrange(1,len(irlist)+1)], var_name='id', value_name='V') 

當...數據框被擠壓到只有兩列,所以我想我會需要的東西棘手。

任何人都知道如何以上面顯示的方式重新索引DataFrame?

該函數會被調用很多次,所以速度優化也非常重要。

回答

0

與開始:

Int64Index: 11 entries, 0 to 10 
Data columns (total 6 columns): 
I1 11 non-null float64 
V1 11 non-null float64 
I2 11 non-null float64 
V2 11 non-null float64 
I3 11 non-null float64 
V3 11 non-null float64 
dtypes: float64(6) 

嘗試:

pd.concat([df.loc[:, ['V{}'.format(i), 'I{}'.format(i)]].rename(columns={'I{}'.format(i): 'I'}) for i in range(1, 4)]) 

獲得:

  I  V1  V2  V3 
0 13.823560 0.000000  NaN  NaN 
1 13.823376 0.001274  NaN  NaN 
2 13.823193 0.002547  NaN  NaN 
3 13.823009 0.003821  NaN  NaN 
4 13.822826 0.005095  NaN  NaN 
5 13.822642 0.006368  NaN  NaN 
6 0.613282 0.630456  NaN  NaN 
7 0.455202 0.631730  NaN  NaN 
8 0.296663 0.633004  NaN  NaN 
9 0.137670 0.634277  NaN  NaN 
10 -0.021770 0.635551  NaN  NaN 
0 13.639405  NaN 0.000000  NaN 
1 13.639224  NaN 0.001273  NaN 
2 13.639043  NaN 0.002546  NaN 
3 13.638862  NaN 0.003819  NaN 
4 13.638681  NaN 0.005092  NaN 
5 13.638500  NaN 0.006365  NaN 
6 0.610912  NaN 0.630109  NaN 
7 0.453456  NaN 0.631381  NaN 
8 0.295533  NaN 0.632654  NaN 
9 0.137149  NaN 0.633927  NaN 
10 -0.021688  NaN 0.635200  NaN 
0 13.455246  NaN  NaN 0.000000 
1 13.455068  NaN  NaN 0.001272 
2 13.454889  NaN  NaN 0.002544 
3 13.454711  NaN  NaN 0.003817 
4 13.454532  NaN  NaN 0.005089 
5 13.454354  NaN  NaN 0.006361 
6 0.608497  NaN  NaN 0.629756 
7 0.451677  NaN  NaN 0.631028 
8 0.294383  NaN  NaN 0.632301 
9 0.136619  NaN  NaN 0.633573 
10 -0.021605  NaN  NaN 0.634845 
+0

是否也可以取得同樣的數據幀,但隨後NaN的副本,而不是爲(行,列)值上的V-列在原始DataFrame中沒有鏈接? (例如,I = 13.823560只與V1 = 0.000000匹配,另外兩個(V2,V3)與NaN匹配) –

+0

查看更新 - 這更接近您要查找的內容嗎? – Stefan

+0

正是我在找的 - 太棒了!非常感謝! –