2016-01-22 109 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

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