连接数据框,这些数据框是包含在不同Dicts列表中的Dicts中的值

时间:2019-07-24 20:50:13

标签: python pandas

我有2个列表,每个列表包含几个单元素字典。字典以字符串作为键,以DataFrame作为值。键在列表中未按字母顺序排序。我的目标是在与每个字典键相对应的每个列表中的DataFrame上执行pandas join功能。

示意性地:

background: linear-gradient

我的目标是通过循环连接在每个列表上具有相应键的DataFrame,以使代码与键匹配,理想情况下:

import pandas as pd
import numpy as np

a = pd.DataFrame(np.random.randn(4, 4), columns=['h', 'i', 'j', 'k'])
b = pd.DataFrame(np.random.randn(4, 4), columns=['h', 'i', 'j', 'k'])
c = pd.DataFrame(np.random.randn(4, 4), columns=['h', 'i', 'j', 'k'])
d = pd.DataFrame(np.random.randn(4, 4), columns=['h', 'i', 'j', 'k'])
e = pd.DataFrame(np.random.randn(4, 4), columns=['n', 'o', 'p', 'q'])
f = pd.DataFrame(np.random.randn(4, 4), columns=['n', 'o', 'p', 'q'])
g = pd.DataFrame(np.random.randn(4, 4), columns=['n', 'o', 'p', 'q'])
h = pd.DataFrame(np.random.randn(4, 4), columns=['n', 'o', 'p', 'q'])

d1 = {'m':a}
d2 = {'h':b}
d3 = {'z':c}
d4 = {'b':d}
d5 = {'z':e}
d6 = {'h':f}
d7 = {'m':g}
d8 = {'b':h}

l1 = [d1, d2, d3, d4]
l2 = [d5, d6, d7, d8]

我找不到一种方法来找出执行此操作的代码。感谢您的任何事先帮助!

2 个答案:

答案 0 :(得分:2)

您可以循环比较(假设性能不是问题)。在这种情况下,我将在list的{​​{1}}中创建结果,因此您将有4个最终的dict,每个都有连接的dict

DataFrames

如果最终输出是results = [] for d1 in l1: l1 = list(d1.keys())[0] for d2 in l2: if l1 == list(d2.keys())[0]: results.append({list(d1.keys())[0]: d1[l1].join(d2[l1], lsuffix='_suffix') }) results[0]['m'] Out[44]: 0_suffix 1_suffix 2_suffix ... 1 2 3 0 -0.916366 0.340707 0.530867 ... -0.495796 -0.982780 2.354565 1 -0.154919 -0.899602 -0.595742 ... 0.425826 1.220378 1.169143 2 0.187701 -0.933682 -0.035998 ... -0.069469 -1.149548 1.558640 3 0.551400 -0.059035 0.913508 ... 2.001956 -0.130476 -0.896371 的原始 left 数据帧,则只需加入初始obj:

l1

如果您要串联/附加:

for d1 in l1:
    l1 = list(d1.keys())[0]
    for d2 in l2:
        if  l1 == list(d2.keys())[0]:
            d1[l1] = d1[l1].join(d2[l1], lsuffix='_suffix')

d1
Out[46]: 
{'b':    0_suffix  1_suffix  2_suffix  ...         1         2         3
 0  0.369090  1.001815  0.576901  ... -0.886816  0.266766  1.008030
 1  0.585813 -0.725805  0.587021  ... -0.047143  1.319553  0.137310
 2  0.305254  0.187430  0.567565  ...  0.927931  0.923679 -0.932878
 3 -1.648351 -0.605600 -1.614015  ... -0.100864 -0.750169  1.314675

答案 1 :(得分:0)

这是您可以使用的最简单的方法

d1['m'].merge(d2['h'], how='outer')

输出:

       0            1           2           3
0   -0.846978   -0.103178   0.764094    -1.116666
1   1.845743    -2.232665   1.078197    1.437294
2   -0.244121   -0.952903   0.625375    0.907227
3   1.217737    -0.684253   -1.661790   -0.071234
4   1.591530    -0.098318   -0.015063   -0.210989
5   0.382137    1.139896    -0.775984   1.022370
6   0.182091    -1.626770   1.267648    0.987247
7   -1.231164   0.129947    1.773350    -0.880221