使用正确的列名称合并 Pandas 中的多个(2+)数据帧

问题描述 投票:0回答:2

大家。我有以下数据框列表:

df_eurusd = DownloadData('EUR/USD',start_date,end_date,timeframe).GetData()
df_usdjpy = DownloadData('USD/JPY',start_date,end_date,timeframe).GetData()
df_gbpusd = DownloadData('GBP/USD',start_date,end_date,timeframe).GetData()
df_usdcad = DownloadData('USD/CAD',start_date,end_date,timeframe).GetData()
df_usdsek = DownloadData('USD/SEK',start_date,end_date,timeframe).GetData()
df_usdchf = DownloadData('USD/CHF',start_date,end_date,timeframe).GetData()

tickers = {
    'EUR/USD' : df_eurusd,
    'USD/JPY' : df_usdjpy,
    'GBP/USD' : df_gbpusd,
    'USD/CAD' : df_usdcad,
    'USD/SEK' : df_usdsek,
    'USD/CHF' : df_usdchf
}

每个数据帧都有以下格式:

                     Timestamp     Open     High      Low    Close
0    2023-01-10 00:00:00+00:00  1.07324  1.07381  1.07205  1.07273
1    2023-01-10 01:00:00+00:00  1.07273  1.07396  1.07259  1.07360
2    2023-01-10 02:00:00+00:00  1.07360  1.07424  1.07212  1.07308
3    2023-01-10 03:00:00+00:00  1.07309  1.07341  1.07255  1.07321
4    2023-01-10 04:00:00+00:00  1.07323  1.07339  1.07278  1.07306
...                        ...      ...      ...      ...      ...
5729 2023-12-08 17:00:00+00:00  1.07448  1.07575  1.07402  1.07560
5730 2023-12-08 18:00:00+00:00  1.07560  1.07623  1.07528  1.07571
5731 2023-12-08 19:00:00+00:00  1.07572  1.07616  1.07565  1.07587
5732 2023-12-08 20:00:00+00:00  1.07587  1.07664  1.07569  1.07636
5733 2023-12-08 21:00:00+00:00  1.07636  1.07642  1.07578  1.07592

我需要做的是获得这样的东西:

                     Timestamp  EUR/USD  USD/JPY  GBP/USD  USD/CAD  ...
0    2023-01-10 00:00:00+00:00  1.07324  1.07381  1.07205  1.07273
1    2023-01-10 01:00:00+00:00  1.07273  1.07396  1.07259  1.07360
2    2023-01-10 02:00:00+00:00  1.07360  1.07424  1.07212  1.07308
...                        ...      ...      ...      ...      ...

基本上提取每个数据帧的“关闭”列并将其插入到一个新的数据帧中,该数据帧收集按同一日期(“时间戳”)索引的所有“关闭”列。

我尝试了很多其他人在这里建议的事情,但我无法实现。一个重要的部分是不必手动输入最终 df 的每一列的名称,因为当然,我可能会使用多达 100 个数据帧,并且我无法手动输入每个数据帧。

谢谢。

python pandas database dataframe finance
2个回答
0
投票

您可以使用

concat
和字典理解:

out = pd.concat({k: x.set_index('Timestamp')['Close']
                 for k, x in tickers.items()},
                axis=1).reset_index()

0
投票

假设您想获得

EUR/USD
USD/JPY
:

  • 创建目标列表:
    tickers = ['EUR/USD', 'USD/JPY']
  • 对于
    tickers
    中的每个元素:
    • 使用
      DownloadData
    • 获取数据
    • 提取
      Timestamp
      Close
    • 将数据添加到列表中
      dfs_close
  • 使用 pd.concat 连接 dfs。使用
    keys
    参数创建带有
    tickers
  • 的多级列
  • 删除
    Close
    列级别

这是完整的代码:

tickers = ['EUR/USD', 'USD/JPY']

dfs_close = []

for ticker in tickers:
  df = DownloadData('EUR/USD',start_date,end_date,timeframe).GetData()
  df = df[['Timestamp', 'Close']].set_index('Timestamp')
  dfs_close.append(df)

merged_df = pd.concat(dfs_close, axis=1, keys=tickers)

merged_df.columns  = merged_df.columns.droplevel(1)
© www.soinside.com 2019 - 2024. All rights reserved.