如何将多索引数据帧与单个索引数据帧连接?

2024-04-19 05:32:54 发布

您现在位置:Python中文网/ 问答频道 /正文

df1的单个索引与df2的多索引的子级相匹配。两者都有相同的列。我想把df1的所有行和列复制到df2。在

它类似于这个线程: copying a single-index DataFrame into a MultiIndex DataFrame

但是这个解决方案只适用于一个索引值,在这种情况下是索引'a'。我想对df1的所有索引执行此操作。在

In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: import itertools
In [4]: inner = ('a','b')
In [5]: outer = ((10,20), (1,2))
In [6]: cols = ('one','two','three','four')
In [7]: sngl = pd.DataFrame(np.random.randn(2,4), index=inner, columns=cols)
In [8]: index_tups = list(itertools.product(*(outer + (inner,))))
In [9]: index_mult = pd.MultiIndex.from_tuples(index_tups)
In [10]: mult = pd.DataFrame(index=index_mult, columns=cols)
In [11]: sngl
Out[11]: 
        one       two     three      four
a  2.946876 -0.751171  2.306766  0.323146
b  0.192558  0.928031  1.230475 -0.256739

In [12]: mult
Out[12]: 
        one  two three four
10 1 a  NaN  NaN   NaN  NaN
     b  NaN  NaN   NaN  NaN
   2 a  NaN  NaN   NaN  NaN
     b  NaN  NaN   NaN  NaN
20 1 a  NaN  NaN   NaN  NaN
     b  NaN  NaN   NaN  NaN
   2 a  NaN  NaN   NaN  NaN
     b  NaN  NaN   NaN  NaN


In [13]: mult.ix[(10,1)] = sngl

In [14]: mult
Out[14]: 
        one  two three four
10 1 a  NaN  NaN   NaN  NaN
     b  NaN  NaN   NaN  NaN
   2 a  NaN  NaN   NaN  NaN
     b  NaN  NaN   NaN  NaN
20 1 a  NaN  NaN   NaN  NaN
     b  NaN  NaN   NaN  NaN
   2 a  NaN  NaN   NaN  NaN
     b  NaN  NaN   NaN  NaN

@Jeff给出的解决方案是

^{pr2}$

我不能这样做:

nm.loc[:,sngl.columns] = sngl.loc[:].values

它将引发值错误:“无法将大小为X的序列复制到维数为Y的数组轴”

我正在使用循环。但这不是熊猫的方式。在


Tags: inimportdataframeindexnanonepdthree
1条回答
网友
1楼 · 发布于 2024-04-19 05:32:54

但我也可能会觉得这本手册有点像:

In [46]: mult[:] = sngl.loc[mult.index.get_level_values(2)].values

In [47]: mult
Out[47]: 
             one       two     three      four
10 1 a  1.175042  0.044014  1.341404 -0.223872
     b  0.216168 -0.748194 -0.546003 -0.501149
   2 a  1.175042  0.044014  1.341404 -0.223872
     b  0.216168 -0.748194 -0.546003 -0.501149
20 1 a  1.175042  0.044014  1.341404 -0.223872
     b  0.216168 -0.748194 -0.546003 -0.501149
   2 a  1.175042  0.044014  1.341404 -0.223872
     b  0.216168 -0.748194 -0.546003 -0.501149

也就是说,首先选择要用于索引的元素:

^{pr2}$

然后使用这些索引到sngl

In [65]: sngl.loc[mult.index.get_level_values(2)]
Out[65]: 
        one       two     three      four
a  1.175042  0.044014  1.341404 -0.223872
b  0.216168 -0.748194 -0.546003 -0.501149
a  1.175042  0.044014  1.341404 -0.223872
b  0.216168 -0.748194 -0.546003 -0.501149
a  1.175042  0.044014  1.341404 -0.223872
b  0.216168 -0.748194 -0.546003 -0.501149
a  1.175042  0.044014  1.341404 -0.223872
b  0.216168 -0.748194 -0.546003 -0.501149

然后我们可以使用.values来丢弃索引信息,只需要填充原始数组。在

不太优雅,但很直白。在

相关问题 更多 >