Python 不规则长度列表的多索引

Python 不规则长度列表的多索引,python,pandas,multi-index,Python,Pandas,Multi Index,我有一个列表,我想把它做成一个多索引熊猫数据框架,然后我可以合并到一个原始熊猫数据框架。列表的每一行由一个观察值组成,列表中的值由与该观察值匹配的对应行组成 以下是我所拥有的一个简单版本: 原始数据帧的形式如下: original=(pd.DataFrame([['JFK','New York, NY'],['EWR','Newark, NJ'], ['BWI','Baltimore, MD'],['PHL','Philadelphia, PA']

我有一个列表,我想把它做成一个多索引熊猫数据框架,然后我可以合并到一个原始熊猫数据框架。列表的每一行由一个观察值组成,列表中的值由与该观察值匹配的对应行组成

以下是我所拥有的一个简单版本:

原始数据帧的形式如下:

original=(pd.DataFrame([['JFK','New York, NY'],['EWR','Newark, NJ'],
                        ['BWI','Baltimore, MD'],['PHL','Philadelphia, PA'],
                        ['DCA','Washington, DC']],columns=['ID','City']))
original
    ID              City
0  JFK      New York, NY
1  EWR        Newark, NJ
2  BWI     Baltimore, MD
3  PHL  Philadelphia, PA
4  DCA    Washington, DC
匹配输出(将位置与特定半径内的其他位置匹配)是一个列表列表,如下所示:

matches=[[0],[1,3],[2],[1,3],[4]]
matches
[[0], [1, 3], [2], [1, 3], [4]]
以下是我希望它的外观:

              ID              City
Org Match
0   0        JFK      New York, NY
1   1        EWR        Newark, NJ 
    3        PHL  Philadelphia, PA 
2   2        BWI     Baltimore, MD
3   1        EWR        Newark, NJ
    3        PHL  Philadelphia, PA
4   4        DCA    Washington, DC
我知道如何在多索引级别上进行连接,但不知道如何获得正确的多索引。最终,这将需要大规模完成。也很乐意以不同的方式接近


潜在的问题是将位置与给定距离内的所有其他位置相匹配。这是在一个单独的模块中完成的,输出是上面引用的列表列表。

我将构建索引,与
原始
设置索引

ret = (pd.concat(pd.DataFrame({'Org':i, 'Match':v}) for i,v in enumerate(matches))
         .merge(original, left_on='Match', right_index=True, how='left')
         .set_index(['Org','Match'])
      )
输出:

            ID              City
Org Match                       
0   0      JFK      New York, NY
1   1      EWR        Newark, NJ
    3      PHL  Philadelphia, PA
2   2      BWI     Baltimore, MD
3   1      EWR        Newark, NJ
    3      PHL  Philadelphia, PA
4   4      DCA    Washington, DC
您可以使用:

输出

            ID              City
Org Match                       
0   0      JFK      New York, NY
1   1      EWR        Newark, NJ
    3      PHL  Philadelphia, PA
2   2      BWI     Baltimore, MD
3   1      EWR        Newark, NJ
    3      PHL  Philadelphia, PA
4   4      DCA    Washington, DC

匹配项
构造一个序列,并使用
分解
获取用于
重新索引
设置索引
的值。最后,
swaplevel

s = pd.Series(matches).explode()
df = original.reindex(s).set_index(s.index, append=True).swaplevel(1,0)

Out[54]:
      ID              City
0 0  JFK      New York, NY
1 1  EWR        Newark, NJ
  3  PHL  Philadelphia, PA
2 2  BWI     Baltimore, MD
3 1  EWR        Newark, NJ
  3  PHL  Philadelphia, PA
4 4  DCA    Washington, DC

或者您可以构造多索引,并使用它来
重新索引
设置索引
,并重新排序最终df的多索引顺序

ix = pd.MultiIndex.from_tuples([(i, y) for i, x in enumerate(matches) for y in x])
df = original.reindex(ix.get_level_values(1)).set_index(ix.get_level_values(0), append=True).swaplevel(1,0) 

Out[43]:
      ID              City
0 0  JFK      New York, NY
1 1  EWR        Newark, NJ
  3  PHL  Philadelphia, PA
2 2  BWI     Baltimore, MD
3 1  EWR        Newark, NJ
  3  PHL  Philadelphia, PA
4 4  DCA    Washington, DC
ix = pd.MultiIndex.from_tuples([(i, y) for i, x in enumerate(matches) for y in x])
df = original.reindex(ix.get_level_values(1)).set_index(ix.get_level_values(0), append=True).swaplevel(1,0) 

Out[43]:
      ID              City
0 0  JFK      New York, NY
1 1  EWR        Newark, NJ
  3  PHL  Philadelphia, PA
2 2  BWI     Baltimore, MD
3 1  EWR        Newark, NJ
  3  PHL  Philadelphia, PA
4 4  DCA    Washington, DC