如何从两个DataFrame中订购和保留公共索引

时间:2016-05-18 02:51:01

标签: python pandas

我有两个DataFrames

import pandas as pd
import io
from scipy import stats


ctrl=u"""probegenes,sample1,sample2,sample3
1415777_at Pnliprp1,20,0.00,11
1415884_at Cela3b,47,0.00,100
1415805_at Clps,17,0.00,55
1115805_at Ckkk,77,10.00,5.5
"""

df_ctrl = pd.read_csv(io.StringIO(ctrl),index_col='probegenes')

test=u"""probegenes,sample1,sample2,sample3
1415777_at Pnliprp1,20.1,10.00,22.3
1415805_at Clps,7,3.00,1.5
1415884_at Cela3b,47,2.01,30"""

df_test = pd.read_csv(io.StringIO(test),index_col='probegenes')

他们看起来像这样:

In [35]: df_ctrl
Out[35]:
                     sample1  sample2  sample3
probegenes
1415777_at Pnliprp1       20        0     11.0
1415884_at Cela3b         47        0    100.0
1415805_at Clps           17        0     55.0
1115805_at Ckkk           77       10      5.5

In [36]: df_test
Out[36]:
                     sample1  sample2  sample3
probegenes
1415777_at Pnliprp1     20.1    10.00     22.3
1415805_at Clps          7.0     3.00      1.5
1415884_at Cela3b       47.0     2.01     30.0

我想:

  1. index
  2. 获取通用DataFrame
  3. 同样重新排列DataFrame
  4. 因此,最后我得到两个新的DataFrame

    new_df_ctrl 
    
                         sample1  sample2  sample3
    probegenes
    1415884_at Cela3b         47        0    100.0
    1415805_at Clps           17        0     55.0
    1415777_at Pnliprp1       20        0     11.0
    
    
    new_df_test
    
                         sample1  sample2  sample3
    probegenes
    1415884_at Cela3b       47.0     2.01     30.0
    1415805_at Clps          7.0     3.00      1.5
    1415777_at Pnliprp1     20.1    10.00     22.3
    

2 个答案:

答案 0 :(得分:3)

您可以将join与参数how='inner'一起使用以获取公共索引。然后使用这个公共索引重新索引每个数据帧。

idx = df_ctrl.join(df_test, rsuffix='_', how='inner').index

>>> df_ctrl.reindex(idx)
                     sample1  sample2  sample3
probegenes                                    
1415777_at Pnliprp1       20        0       11
1415805_at Clps           17        0       55
1415884_at Cela3b         47        0      100

>>> df_test.reindex(idx)
                     sample1  sample2  sample3
probegenes                                    
1415777_at Pnliprp1     20.1    10.00     22.3
1415805_at Clps          7.0     3.00      1.5
1415884_at Cela3b       47.0     2.01     30.0

答案 1 :(得分:1)

您可以使用pd.Index.intersection()并使用.loc[].reindex()进行选择。使用.sort_values()上的index获取所需的排序:

idx = df_ctrl.index.intersection(df_test.index).sort_values(ascending=False)

df_ctrl.loc[idx]

                     sample1  sample2  sample3
probegenes                                    
1415884_at Cela3b         47      0.0    100.0
1415805_at Clps           17      0.0     55.0
1415777_at Pnliprp1       20      0.0     11.0

df_test.loc[idx]

                     sample1  sample2  sample3
probegenes                                    
1415884_at Cela3b       47.0     2.01     30.0
1415805_at Clps          7.0     3.00      1.5
1415777_at Pnliprp1     20.1    10.00     22.3