重新索引数据框;使用多列中的元素填充索引

时间:2016-01-22 16:07:47

标签: python python-2.7 pandas

我有一个Pandas DataFrame,如下所示:

            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]

我想要做的是重塑DataFrame,使它看起来像这样:

#(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]

换句话说,我想用所有“I”标记列(在我的例子中为1到60)中遇到的所有值填充新的DataFrame索引。但是,我还想暂时保留其余的V列 - 只要它们仍然链接到它们原来的I对应值。

尝试以下内容时......

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

... DataFrame被挤压到两列,所以我想我需要一些比较棘手的东西。

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

该函数将被调用很多次,因此速度优化也非常重要。

1 个答案:

答案 0 :(得分: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