首页 > 解决方案 > 使用多索引在 DataFrame 中添加一行

问题描述

我想在每个日期创建一个新的 DataFrame 和一堆股票数据。

  1. 使用多索引 - 日期和股票代码声明 DataFrame。

  2. 添加 2020-06-07 的数据

            date        stock   open    high    low     close
            2020-06-07  AAPL   33.50    34.20   32.1    33.30
            2020-06-07  MSFT   53.50    54.20   32.1    53.30
    
  3. 添加 2020-06-08 的数据

            date        stock   open    high    low     close
            2020-06-07  AAPL   33.50    34.20   32.1    33.30
            2020-06-07  MSFT   53.50    54.20   32.1    53.30
            2020-06-08  AAPL   32.50    34.20   31.1    32.30
            2020-06-08  MSFT   58.50    59.20   52.1    53.30
    

什么是最好和最有效的解决方案?

这是我当前的版本,它不能按我的预期工作。

            df = pd.DataFrame()
            for date in dates:
                universe500 = get_universe(date) #returns stocks on a specific date
                for security in universe500:
                    prices = data.get_prices(security, ['open','high','low','close'], 1, '1d') # returns pd.DataFrame
                    df.iloc[(date, security),:] = prices

标签: pythonpandasdataframemulti-index

解决方案


如果prices是以DataFrame与原始格式相同的方式格式化,则df可以使用concat

In[0]:

#consttucting a fake entry
arrays = [['06-07-2020'], ['ABCD']]
multi = pd.MultiIndex.from_arrays(arrays, names=('date', 'stock'))
to_add = pd.DataFrame({'open':1, 'high':2, 'low':3, 'close':4},index=multi)
print(to_add)

Out[0]:
                  open  high  low  close
date       stock                        
2020-06-09 ABCD      1     2    3      4
In[1]:

#now adding to your data
df = pd.concat([df, to_add])
print(df)

Out[1]:
                  open  high   low  close
date       stock                         
2020-06-07 AAPL   33.5  34.2  32.1   33.3
           MSFT   53.5  54.2  32.1   53.3
2020-06-08 AAPL   32.5  34.2  31.1   32.3
           MSFT   58.5  59.2  52.1   53.3
2020-06-09 ABCD    1.0   2.0   3.0    4.0

如果数据 ( prices) 只是 4 个数字(开盘价、最高价、最低价和收盘价)的数组,则loc可以在您使用的地方工作iloc

In[2]:

df.loc[('2020-06-10','WXYZ'),:] = [10,20,30,40]

Out[2]:

                  open  high   low  close
date       stock                         
2020-06-07 AAPL   33.5  34.2  32.1   33.3
           MSFT   53.5  54.2  32.1   53.3
2020-06-08 AAPL   32.5  34.2  31.1   32.3
           MSFT   58.5  59.2  52.1   53.3
2020-06-09 ABCD    1.0   2.0   3.0    4.0
2020-06-10 WXYZ   10.0  20.0  30.0   40.0

推荐阅读