【问题标题】:Pandas align multiindex dataframe with other with regular index熊猫将多索引数据框与其他具有常规索引的数据框对齐
【发布时间】:2014-02-28 20:35:24
【问题描述】:

我有一个数据框,我们称之为df1,带有一个MultiIndex(只是一个sn-p,还有更多的列和行)

                                             M1_01  M1_02  M1_03  M1_04  M1_05
Eventloc                  Exonloc                                             
chr10:52619746-52623793|- 52622648-52622741      0      0      0      0      0
chr19:58859211-58865080|+ 58864686-58864827      0      0      0      0      0
                          58864686-58864840      0      0      0      0      0
                          58864744-58864840      0      0      0      0      0
chr19:58863054-58863649|- 58863463-58863550      0      0      0      0      0

还有另一个数据框,让我们使用创意名称df2,就像这样(这些是不同算法的结果,这就是它们具有不同索引的原因)。列是相同的,但在第一个 df 中它们没有排序。

                                                                                  M1_01  M1_02  M1_03  M1_04  M1_05
chr3:53274267:53274364:-@chr3:53271813:53271836:-@chr3:53268999:53269190:-         0.02    NaN    NaN    NaN    NaN
chr2:9002720:9002852:-@chr2:9002401:9002452:-@chr2:9000743:9000894:-               0.04    NaN    NaN    NaN    NaN
chr1:160192441:160192571:-@chr1:160190249:160190481:-@chr1:160188639:160188758:-    NaN    NaN    NaN    NaN    NaN
chr7:100473194:100473333:+@chr7:100478317:100478390:+@chr7:100478906:100479034:+    NaN    NaN    NaN    NaN    NaN
chr11:57182088:57182204:-@chr11:57177408:57177594:-@chr11:57176648:57176771:-       NaN    NaN    NaN    NaN    NaN 

我有这个数据框,让我们再次发挥创造力,称之为df3,它统一了df1df2的索引:

                                                                                                    Eventloc              Exonloc
event_id                                                                                                                         
chr3:53274267:53274364:-@chr3:53271813:53271836:-@chr3:53268999:53269190:-          chr3:53269191-53274267|-    53271812-53271836
chr2:9002720:9002852:-@chr2:9002401:9002452:-@chr2:9000743:9000894:-                  chr2:9000895-9002720|-      9002400-9002452
chr1:160192441:160192571:-@chr1:160190249:160190481:-@chr1:160188639:160188758:-  chr1:160188759-160192441|-  160190248-160190481
chr7:100473194:100473333:+@chr7:100478317:100478390:+@chr7:100478906:100479034:+  chr7:100473334-100478906|+  100478316-100478390
chr4:55124924:55124984:+@chr4:55127262:55127579:+@chr4:55129834:55130094:+          chr4:55124985-55129834|+    55127261-55127579

我需要对这些结果进行 1:1 比较,所以我尝试了两者

df1.ix[df3.head().values]

df1.ix[pd.MultiIndex.from_tuples(df3.head().values.tolist(), names=['Eventloc', 'Exonloc'])]

但他们都给了我 NA 的数据帧。唯一有效的是:

event_id = df2.index[0]
df1.ix[df3.ix[event_id]]

但这显然不是最理想的,因为它没有矢量化并且非常慢。我想我错过了 MultiIndexes 的一些关键概念。

谢谢, 奥尔加

【问题讨论】:

  • 你能试试df1.ix[pd.Index(df3.head().values)]吗?我认为这可能对你有用。
  • 不知何故仍然无法正常工作,即使我已经两次和三次检查了 ID。
  • 实际上,是的,它有效!我的整个问题是我通过重置另一个数据框的索引创建了df1,而我只使用了head(),这就是为什么我没有得到任何重叠。

标签: python indexing pandas alignment dataframe


【解决方案1】:

如果我理解你在做什么,你需要明确地构造元组(尽管它们必须是完全限定的元组,例如每个级别都有一个值),或者更简单,构造一个布尔索引器)

In [7]: df1 = DataFrame(0,index=MultiIndex.from_product([list('abc'),[range(2)]]),columns=['A'])

In [8]: df1
Out[8]: 
     A
a 0  0
b 1  0
c 0  0

[3 rows x 1 columns]

In [9]: df1 = DataFrame(0,index=MultiIndex.from_product([list('abc'),list(range(2))]),columns=['A'])

In [10]: df1
Out[10]: 
     A
a 0  0
  1  0
b 0  0
  1  0
c 0  0
  1  0

[6 rows x 1 columns]

In [11]: df3 = DataFrame(0,index=['a','b'],columns=['A'])

In [12]: df3
Out[12]: 
   A
a  0
b  0

[2 rows x 1 columns]

这些都是第一帧中level 0的所有值

In [13]: df1.index.get_level_values(level=0)
Out[13]: Index([u'a', u'a', u'b', u'b', u'c', u'c'], dtype='object')

构造结果的布尔索引器

In [14]: df1.index.get_level_values(level=0).isin(df3.index)
Out[14]: array([ True,  True,  True,  True, False, False], dtype=bool)

In [15]: df1.loc[df1.index.get_level_values(level=0).isin(df3.index)]
Out[15]: 
     A
a 0  0
  1  0
b 0  0
  1  0

[4 rows x 1 columns]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2012-12-18
    • 2022-07-10
    • 2020-12-02
    • 2020-10-08
    • 2017-02-22
    • 2019-05-21
    相关资源
    最近更新 更多