【问题标题】:group by same partial string of pandas dataframe column按熊猫数据框列的相同部分字符串分组
【发布时间】:2016-05-17 12:49:53
【问题描述】:

我有几个 csv 文件,每个文件都包含一个月内的一种股票价格,并且有数百万条数据。 原始的 csv 数据数据如下:

AA_Candy.csv

Index   CompanyName      Time       Price
  1      AA Candy    030101090355   1.78
  2      AA Candy    030101091533   1.79
  .......
333498   AA Candy    031231145556   2.18

BB_Cookie.csv

   1     BB Cookie   030101090225   3.20
   2     BB Cookie   030101090845   3.14
  .......
391373   BB Cookie   031231145958   3.88

我使用 python 和 pandas 来处理数据,在我加载并组合了一些数据文件之后,现在我有一个如下的数据框:

帧:

Index   CompanyName      Time       Price
  1      AA Candy    030101090355   1.78
  2      AA Candy    030101091533   1.79
  .......
333498   AA Candy    031231145556   2.18
333499   BB Cookie   030101090225   3.20
333500   BB Cookie   030101090845   3.14
  .......
712871   BB Cookie   031231145958   3.88

时间031231145958代表2013-12-31 14:59:58

现在我想得到每家公司每小时的最高价格和最终价格,并得到一个输出文件,如:

range_start   AA Candy/Max    AA Candy/Close    BB Cookie/Max     BB Cookie/Close
0301010900     1.79              1.77            3.20              3.10
........
0312311400     2.24              2.18            3.88              3.88

因此,我想通过 CompanyName 和 Time 的前 8 个字符进行分组,以获取同一公司在一小时内的数据,然后进行计算以找到每个公司的最大价格值和最终价格值,并输出相同的结果连续开始一小时;让 companyName/Max 或 Close 成为新的列名。

因为我是 pandas 和 dataframe 的新手,所以我有以下问题:

  1. 如何按时间列(对象)的前8个字符对数据进行分组,然后得到我的期望值?
  2. 如何形成一个新的输出数据帧/矩阵作为我的预期输出?

谢谢!!

【问题讨论】:

  • 这很宽泛,三个问题。尤其是与使看不见的代码“更快”运行有关的第三个问题。关于 SO 的好问题需要集中注意力并提供尽可能多的具体细节。
  • 不会 031231145958 代表 2003-12-31 14:59:58 吗?

标签: python csv pandas ipython dataframe


【解决方案1】:

对公司名称和字符串时间戳的前 8 个字符(即日期加小时)执行 groupby。然后在价格上使用agg 来获取每个(第一个、最大、最小和最后一个)的自定义函数。取消堆叠公司名称,交换公司名称的级别和打开/高/低/关闭,并可选择对您的符号进行排序。

gb = (df.groupby(['CompanyName', df.Time.str[:8]])
        .Price
        .agg({'open': 'first', 
              'high': np.max, 
              'low': np.min, 
              'close': 'last'})[['open', 'high', 'low', 'close']]
        .unstack('CompanyName'))
gb.columns = gb.columns.swaplevel(0, 1)
>>> gb.sortlevel(level=0, axis=1)
CompanyName AA Candy                   BB Cookie                  
                open  high   low close      open  high   low close
Time                                                              
03010109        1.78  1.79  1.78  1.79      3.20  3.20  3.14  3.14
03123114        2.18  2.18  2.18  2.18      3.88  3.88  3.88  3.88

【讨论】:

    【解决方案2】:

    对于第一个问题,您可以使用

    df.groupby(df.Time.str[0:8])
    

    对于您的第二个问题,unstack 应该是您想要的:

    df.groupby(df.Time.str[0:8]).unstack()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 2017-09-09
      • 2017-07-08
      • 1970-01-01
      • 2021-02-21
      • 2018-07-19
      • 2017-07-08
      相关资源
      最近更新 更多