pandas 通过循环合并两个字典中的 Dataframe

rkttyhzu  于 2022-11-27  发布在  其他
关注(0)|答案(2)|浏览(194)

试图保持这个相对简单,但让我知道,如果你需要更多的信息。
我有两个字典,每个字典由三个 Dataframe 组成,它们通过循环产生,然后添加到字典中。它们有共同的键['XAUUSD','EURUSD','GBPUSD']:
贸易法令

{'XAUUSD': df_trades_1

'EURUSD': df_trades_2

'GBPUSD': df_trades_3}

价格_法令

{'XAUUSD': df_prices_1

'EURUSD': df_prices_2

'GBPUSD': df_prices_3}

我想合并最近时间戳上的表,以生成3个新的 Dataframe ,这样XAUUSD交易 Dataframe 将与相应的XAUUSD价格 Dataframe 合并,依此类推
我已经能够使用以下语句将 Dataframe 连接到循环中:

df_merge_list = []

for trades in trades_dict.values():
    for prices in prices_dict.values():
        df_merge = pd.merge_asof(trades, prices, left_on='transact_time', right_on='time', direction='backward')
        df_merge_list.append(df_merge)

然而,这产生了9个 Dataframe 的列表,XAUUSD交易+XAUUSD价格,XAUUSD交易+EURUSD价格和XAUUSD交易+GBPUSD价格等。
有没有办法只连接那些键相同的 Dataframe 呢?我假设它应该是这样的:if trades_dict.keys() == prices_dict.keys():

df_merge_list = []

for trades in trades_dict.values():
    for prices in prices_dict.values():
        if trades_dict.keys() == prices_dict.keys():
            df_merge = pd.merge_asof(trades, prices, left_on='transact_time', right_on='time', direction='backward')
            df_merge_list.append(df_merge)

但我得到的结果和上面的一样
我接近了吗?我怎样才能对所有仪器做到这一点,并只产生我需要的3个输出?任何帮助都是感激之情
先谢了

xwbd5t1u

xwbd5t1u1#

"""
Pseudocode :
For each key in the list of keys in trades_dict :
    Pick that key's value (trades df) from trades_dict
    Using the same key, pick corresponding value (prices df) from prices_dict
    Merge both values (trades & prices dataframes)
"""

df_merge_list = []

for key in trades_dict.keys():
    trades = trades_dict[key]
    prices = prices_dict[key] # using the same key to get corresponding prices

    df_merge = pd.merge_asof(trades, prices, left_on='transact_time', right_on='time', direction='backward')
    df_merge_list.append(df_merge)

问题中发布的代码出现了什么错误?
1.嵌套for循环创建笛卡尔积
外循环中的3次迭代乘以内循环中的3次迭代= 9次迭代

  1. trades_dict.keys() == prices_dict.keys()的结果在所有9次迭代中均为True
    dict_a_all_keys == dict_b_all_keysdict_a_key_1 == dict_b_key_1不同。因此,您可以遍历字典的键,并检查它们是否在嵌套循环中匹配,如下所示:
df_merge_list = []

for trades_key in trades_dict.keys():
    for prices_key in prices_dict.keys():
        if trades_key == prices_key:
            trades = trades_dict[trades_key]
            prices = prices_dict[trades_key] # since trades_key is same as prices_key, they are interchangeable
            df_merge = pd.merge_asof(trades, prices, left_on='transact_time', right_on='time', direction='backward')
            df_merge_list.append(df_merge)
nhhxz33t

nhhxz33t2#

您需要以可重现的形式提供带有正确列名的确切 Dataframe ,但您可以使用如下字典:

import numpy as np
import pandas as pd

np.random.seed(42)
df_trades_1 = df_trades_2 = df_trades_3 = pd.DataFrame(np.random.rand(10, 2), columns = ['ID1', 'Val1'])
df_prices_1 = df_prices_2 = df_prices_3 = pd.DataFrame(np.random.rand(10, 2), columns = ['ID2', 'Val2'])
trades_dict = {'XAUUSD':df_trades_1, 'EURUSD':df_trades_2, 'GBPUSD':df_trades_3}
prices_dict = {'XAUUSD':df_prices_1, 'EURUSD':df_prices_2, 'GBPUSD':df_prices_3}

frames ={}
for t in trades_dict.keys():
    frames[t] = (pd.concat([trades_dict[t], prices_dict[t]], axis = 1))
frames['XAUUSD']

这将连接两个 Dataframe ,使它们在同一个键下可用:

ID1      Val1       ID2      Val2
0  0.374540  0.950714  0.611853  0.139494
1  0.731994  0.598658  0.292145  0.366362
2  0.156019  0.155995  0.456070  0.785176
3  0.058084  0.866176  0.199674  0.514234
4  0.601115  0.708073  0.592415  0.046450
5  0.020584  0.969910  0.607545  0.170524
6  0.832443  0.212339  0.065052  0.948886
7  0.181825  0.183405  0.965632  0.808397
8  0.304242  0.524756  0.304614  0.097672
9  0.431945  0.291229  0.684233  0.440152

你可能需要一些错误检查,以防你的键不匹配,或者连接的类型(左,右,内部等)取决于你的列,但这是它的要点。

相关问题