组织多个数据框的最佳方法

时间:2019-05-06 16:09:51

标签: python pandas dataframe

我是python的新手,正在尝试学习如何使用数据框。我读到的使用库存数据是一个很好的掌握项目的方法。

所以我找到了1990年到2010年之间的一些每日库存数据。每只股票有5列,

  

日期,开盘价,高价,低价和收盘价

因此,我正在尝试锻炼什么是组织数据的最佳方法。

让我们说我有多只股票的数据。最好将它们全部合并成一个大数据框或将数据框彼此堆叠?还是我还缺少另一种方法?

1 个答案:

答案 0 :(得分:2)

假设您有三只股票,分别名为S1S2S3,并且 已有一个数据框:

import pandas as pd

## create some fake data in format described by OP... 
stock_names = ['S1', 'S2', 'S3']

df1 = pd.DataFrame({
  'date': ['2019-05-05', '2019-05-06'],
  'openp': [100, 110], 'highp': [115, 120], 
  'lowp': [100, 105], 'closep': [110, 120]
})
df2 = pd.DataFrame({
  'date': ['2019-05-05', '2019-05-06'],
  'openp': [110, 120], 'highp': [125, 130], 
  'lowp': [110, 115], 'closep': [120, 130]
})
df3 = pd.DataFrame({
  'date': ['2019-05-05', '2019-05-06'],
  'openp': [120, 130], 'highp': [135, 140], 
  'lowp': [120, 125], 'closep': [130, 140]
})

有几种存储数据的方法(包括OP提到的两种方法)。

## scenario 1: store the dfs in a list that you can iterate over 
##             (can only access stocks by index, not name) 
df_list = [df1, df2, df3]


## scenario 2: dict of data frames -- just a better version of scenario 1 
##             (access a stock by its name, e.g. `df_dict['S1']`) 
df_dict = dict(zip(stock_names, [df1, df2, df3]))


## scenario 3: single data frame, with 'stock' field to track where rows came from. 
##             (nice bc you can do grouped aggregations easily)
stacked_df = pd.concat(
  [df.assign(stock = stock) for df, stock in zip(df_list, stock_names)])

根据我的经验,方案3通常(但并非总是如此!)是最好的选择, 因为它可以与pd.DataFrame.groupby()pd.DataFrame.aggregate()方法配合使用。如果要在交互式外壳中进行探索性数据分析,则非常方便(另请参见the pandas split-apply-combine user guide)。

这是为什么场景3很好的一个示例-可以直接简单地同时计算每只股票的平均开盘价和收盘价(当然,可以在其他情况下完成,只是不使用这种分组汇总链)。

(stacked_df
  .groupby(['stock'])
  .aggregate({'openp': pd.np.mean, 'closep': pd.np.mean}))

##        openp  closep
## stock       
## S1       105     115
## S2       115     125
## S3       125     135

您也可以使用其他感兴趣的聚合功能按多列进行分组,或按日期进行分组等。