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

标签 python pandas

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给出的解决方案是

nm = mult.reset_index().set_index('level_2')
nm.loc['a',sngl.columns] = sngl.loc['a'].values

         level_0  level_1        one        two     three        four
level_2                                                              
a             10        1  0.3738456 -0.2261926 -1.205177  0.08448757
b             10        1        NaN        NaN       NaN         NaN
a             10        2  0.3738456 -0.2261926 -1.205177  0.08448757
b             10        2        NaN        NaN       NaN         NaN
a             20        1  0.3738456 -0.2261926 -1.205177  0.08448757
b             20        1        NaN        NaN       NaN         NaN
a             20        2  0.3738456 -0.2261926 -1.205177  0.08448757
b             20        2        NaN        NaN       NaN         NaN

我做不到:

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

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

我目前正在使用循环。但这不是 pandas 的方式。

最佳答案

这感觉有点过于手动,但实际上我可能会这样做:

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

也就是说,首先选择我们想要用来索引的元素:

In [64]: mult.index.get_level_values(2)
Out[64]: Index(['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b'], dtype='object')

然后使用它们索引到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 丢弃索引信息,只获取要填充的原始数组。

它不是很优雅,但很简单。

关于python - 如何将多索引数据帧与单个索引数据帧连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32747772/

相关文章:

python - 如何使用 Keras model.to_json() 获得 pretty-print JSON?

python - Pandas DataFrame MultiIndex groupby 缺少日期的滚动操作

python - 在双时态数据集上计算移动平均线

python-3.x - 使用 lambda 将字典映射到 pandas 系列

python - 用于在远程服务器上运行命令的交互式 Python 脚本

python - 我可以在 yaml/pyyaml 中转储空白而不是 null 吗?

python - 使用 pandas 将函数应用于每行的每个列值

python-3.x - 比较两个数据框并根据匹配添加特定列值

python - 从包含 python 数字的列表中删除字符串

Python:无法从另一个文件导入字典