是否可以使用groupby对行进行分组(通过对列值求和来确定)?

2024-05-08 23:48:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我想按一列的值对数据帧中的行进行分组。下面给出的示例是,如果我将'NumberOfTrades'的值按150的值分组,那么对前2行进行分组,对后3行进行分组。下一步,据我所知,还需要进一步的步骤,从每组的第一个开始计算开,从每组的最后一个开始计算关,从每组最大的开始计算高,从每组最小的开始计算低。你知道吗

Time     Open   High  Low  Close  NumberOfTrades
17:35     101.1   102  100  101         75
18:42     101     105  101  103         75
18:56     103     108  102  107         50
19:45     107     105  101  103         50
20:01     103     104  101  102         50
Time    Open    High  Low  Close  NumberOfTrades
17:35    101.1   105  100  103         150
18:56    103     108  101  102         150

使用df = df.groupby('Time')['NumberOfTrades'].sum(freq=1000).to_frame()只创建一个包含列Time和NumberOfTrades的新数据帧,我假设将每1000行分组。实际上我想把NumberOfTrades的值加起来等于1000。同时也不会丢失其他列。你知道吗

使用df = df.groupby(['Time', 'Open', 'High' 'Low', 'Close'])['NumberOfTrades'].sum(freq=1000).to_frame()创建一个1xlen(NumberOfTrades列)形状的数据帧,而我需要一个6xN

我也尝试过使用df = df.groupby('Time')['NumberOfTrades'].sum(value=1000).to_frame()尝试将“NumberOfTrades”的值相加到1000,但是当我将值从10调整到>10000时,形状保持不变


Tags: to数据示例dfclosetimeopenframe
2条回答

你可以试试这个:

df['grp'] = (df['NumberOfTrades'].cumsum() % 150).diff().fillna(0).lt(0)[::-1].cumsum()

dd = {'Time':'first',
      'Open':'first',
      'High':'max',
      'Low':'min',
      'Close':'last',
      'NumberOfTrades':'sum'}

df.groupby('grp', sort=False)[['Time','Open','High','Low','Close','NumberOfTrades']]\
  .agg(dd).reset_index(drop=True)

输出:

    Time   Open  High  Low  Close  NumberOfTrades
0  17:35  101.1   105  100    103             150
1  18:56  103.0   108  101    102             150

替换@Scott Boston的解决方案中的.eq(0)而不是.diff().fillna(0).lt(0)。你知道吗

dd = {'Time':'first',
      'Open':'first',
      'High':'max',
      'Low':'min',
      'Close':'last',
      'NumberOfTrades':'sum'}

df['grp'] = (df['NumberOfTrades'].cumsum() % 150).eq(0)[::-1].cumsum()
df.groupby(by='grp', sort=False)[['Time','Open','High','Low','Close','NumberOfTrades']].agg(dd).reset_index(drop=True)

相关问题 更多 >