簡體   English   中英

按熊貓數據框列的相同部分字符串分組

[英]group by same partial string of pandas dataframe column

我有幾個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

因此,我想對公司名稱和時間的前8個字符進行分組,以在一小時內獲得同一公司的數據,然后進行計算以找到每個公司的最大價格值和最終價格值,並在相同的開始時間輸出結果。一排 讓companyName / Max或Close為新列名。

因為我真的是熊貓和數據框的新手,所以我有以下問題:

  1. 如何按時間列(對象)的前8個字符對數據進行分組,然后獲得我的期望值?
  2. 如何形成一個新的輸出數據框/矩陣作為我的預期輸出?

謝謝!!

對公司名稱和字符串時間戳的前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

對於第一個問題,您可以使用

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

對於第二個問題,應根據需要進行unstack

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM