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