按照pandas数据框列的相同部分字符串分组

4
我有几个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处理数据,在加载并合并一些数据文件后,现在有一个类似于下面的DataFrame:
frame:
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个字符对数据进行分组,以获取同一小时内相同公司的数据,然后进行计算以找到每个公司的最大价格值和最终价格值,并在同一起始小时输出带有公司名称/Max或Close的结果;让公司名称/Max或Close成为新列名。
因为我真的很新于pandas和dataframe,所以我有以下问题:
  1. 如何按Time列(Object)的前8个字符分组,然后得到我期望的值?
  2. 如何形成一个新的输出数据框/矩阵作为我期望的输出?
谢谢!!

2
这个问题非常广泛,因为有三个问题。特别是第三个问题涉及使一个未见过的代码运行“更快”。SO上好的问题需要聚焦并尽可能提供具体细节。 - APC
031231145958不是表示2003年12月31日14:59:58吗? - Alexander
2个回答

4

在公司名称和时间戳(即日期加小时)的前8个字符上执行groupby。然后使用agg对价格进行自定义函数处理(包括first、max、min和last)。展开公司名称,交换公司名称和开盘价/最高价/最低价/收盘价的级别,并根据需要对符号进行排序。

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

1
对于你的第一个问题,你可以使用


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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接