我有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]
我找不到一种方法来找出执行此操作的代码。感谢您的任何事先帮助!
答案 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