【问题标题】:Merging All Columns of Pandas DataFrames合并 Pandas DataFrames 的所有列
【发布时间】:2018-06-25 17:15:12
【问题描述】:

我有很多用于股票的熊猫数据框。它们都有以下形式:

df_asset = pd.DataFrame(data=np.random.random((5,4)), index=[0, 1, 2, 3, 4], columns=['Open', 'High', 'Low', 'Close'])

我已将资产名称及其 DataFrame 存储在字典中:

stock_data = {'AAPL' : df_AAPL, 'CSCO' : df_CSCO ...}

我想加入所有这些 DataFrames 来创建一个 MultiIndexed DataFrame 的形式:

df = pd.DataFrame(data=np.random.random((15,4)), index=pd.MultiIndex.from_product([list(range(1,6)), ['AAPL', 'CSCO', 'AMZN']]), columns=['Open', 'High', 'Low', 'Close'])

什么是最优雅(希望最有效)的方法?

感谢您的帮助,

杰克

【问题讨论】:

  • 您如何获取/接收这些财务数据?
  • @MaxU: Iirc,pandas 有一个模块可以拉取股票数据
  • @WillemVanOnsem,谢谢你我知道。如果 OP 使用 pandas_datareader 有一个更优雅的解决方案... ;-)
  • 不幸的是,我正在从 csv 文件本地绘制数据。
  • 你有一个列表中的所有数据帧吗?股票的名称也在列表中吗? (以变量名存储股票名称为problematic。)

标签: python performance pandas dataframe


【解决方案1】:

您可以使用concatenate a dict of DataFramesdfs 进入单个 DataFrame

df = pd.concat(dfs)

df 将使用 dict 键作为 MultiIndex 级别。


例如,

In [85]: dfs = {'AAPL': df_asset, 'CSCO': df_asset}

In [86]: df = pd.concat(dfs); df
Out[86]: 
            Open      High       Low     Close
AAPL 0  0.100276  0.769425  0.060993  0.831183
     1  0.251792  0.336571  0.976984  0.237506
     2  0.611914  0.029576  0.329525  0.203794
     3  0.527770  0.723468  0.887708  0.231006
     4  0.965805  0.508156  0.260214  0.063260
CSCO 0  0.100276  0.769425  0.060993  0.831183
     1  0.251792  0.336571  0.976984  0.237506
     2  0.611914  0.029576  0.329525  0.203794
     3  0.527770  0.723468  0.887708  0.231006
     4  0.965805  0.508156  0.260214  0.063260

要按照您在问题中发布的顺序获取索引级别,请使用swaplevel,后跟sort_index

In [112]: df.swaplevel().sort_index()
Out[112]: 
            Open      High       Low     Close
0 AAPL  0.100276  0.769425  0.060993  0.831183
  CSCO  0.100276  0.769425  0.060993  0.831183
1 AAPL  0.251792  0.336571  0.976984  0.237506
  CSCO  0.251792  0.336571  0.976984  0.237506
2 AAPL  0.611914  0.029576  0.329525  0.203794
  CSCO  0.611914  0.029576  0.329525  0.203794
3 AAPL  0.527770  0.723468  0.887708  0.231006
  CSCO  0.527770  0.723468  0.887708  0.231006
4 AAPL  0.965805  0.508156  0.260214  0.063260
  CSCO  0.965805  0.508156  0.260214  0.063260

【讨论】:

  • 我认为 OP 也想交换索引级别...:df = pd.concat(dfs); df = df.set_index(df.index.swaplevel())
  • 非常感谢您的回答。看起来不错。如果我想将指数0, 1, 2, 3, ... 作为“左指数”,将股票作为“右指数”怎么办?就像我的问题中的df 一样。
  • 啊,谢谢 MaxU。你在我问之前回答了我的问题!
  • @MaxU:是的,谢谢。一路上的某个地方(0.18.1?)swaplevel 被提升为DataFrame method
猜你喜欢
  • 2018-05-16
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
  • 2018-01-29
  • 2019-07-12
相关资源
最近更新 更多