python - 分组并减去 pandas 中的第一次出现和最后一次出现

标签 python pandas

我在 pandas 中有以下数据框

 code    date         time         dip     flag   tank   qty
 123     2018-12-23   08:00:00     389     0      1      1300
 123     2018-12-23   09:00:00     380     0      1      1250
 123     2018-12-23   10:00:00     378     0      1      1200
 123     2018-12-23   11:00:00     345     1      1      1150
 123     2018-12-23   12:00:00     342     1      1      1100
 123     2018-12-23   13:00:00     340     1      1      1050
 123     2018-12-23   14:00:00     338     1      1      1000
 123     2018-12-23   15:00:00     380     0      1      1500
 123     2018-12-23   16:00:00     340     1      1      1000
 123     2018-12-23   17:00:00     340     1      1      1000
 123     2018-12-23   08:00:00     389     0      2      1300
 123     2018-12-23   09:00:00     380     0      2      1250
 123     2018-12-23   10:00:00     378     0      2      1200
 123     2018-12-23   11:00:00     345     1      2      1150
 123     2018-12-23   12:00:00     342     1      2      1100
 123     2018-12-23   13:00:00     340     1      2      1050
 123     2018-12-23   14:00:00     338     1      2      1000

我想知道有多少次 dip 低于 350,直到什么时间(以小时为单位)保持在 350 以下,以及低于 350 时售出的数量是多少 下面是我想要的数据框。当跌幅小于 350 时,我已经将标志设置为 1

 code    date        tank     frequency    qty_sold    time
 123     2018-12-23  1        4            150         3
 123     2018-12-23  2        4            150         3

我可以通过groupby找到频率。需要一些帮助来找到其他两个

  df_agg= df.groupby(['code','date','tank']).agg({'flag':['sum']}).reset_index()

最佳答案

用途:

#create datetimes column
df['datetime'] = pd.to_datetime(df['date'] + ' ' + df['time'])

#add aggregation by first and last 
df_agg= df[df['dip'] < 350].groupby(['code','date','tank']).agg({'flag':['sum'], 
                                                                'datetime':['first','last'],
                                                                'qty':['first','last']})
#flatten MultiIndex
df_agg.columns = df_agg.columns.map('_'.join)

#substract columns, timedeltas convert to hours
df_agg['qty_sold'] = df_agg.pop('qty_first') - df_agg.pop('qty_last') 
df_agg['time'] = (df_agg.pop('datetime_last') - df_agg.pop('datetime_first'))
                       .dt.total_seconds().div(3600).astype(int)
#rename column and create default index
df_agg = df_agg.rename(columns={'flag_size':'frequency'}).reset_index()

print (df_agg)
   code        date  tank  flag_sum  qty_sold  time
0   123  2018-12-23     1         4       150     3
1   123  2018-12-23     2         4       150     3

编辑:

如果日期时间值中没有缺失值并且日期时间的频率相差一小时,则解决方案有效。

想法是为组创建新的辅助列g,如果差异更像1小时并且每个前3个级别的最后总计总和:

df['datetime'] = pd.to_datetime(df['date'] + ' ' + df['time'])

df_agg= df[df['dip'] < 350].copy()

df_agg['g'] = (df_agg.groupby(['code','date','tank'])['datetime'].diff()
                     .ne(pd.Timedelta(1, 'H'))
                     .cumsum())

df_agg= df_agg.groupby(['code','date','tank','g']).agg({'flag':['sum'], 
                                                        'datetime':['first','last'],
                                                        'qty':['first','last']})
df_agg.columns = df_agg.columns.map('_'.join)
df_agg['qty_sold'] = df_agg.pop('qty_first') - df_agg.pop('qty_last') 
df_agg['time'] = ((df_agg.pop('datetime_last') - df_agg.pop('datetime_first'))
                         .dt.total_seconds().div(3600).astype(int))

df_agg = (df_agg.rename(columns={'flag_size':'frequency'})
                .sum(level=[0,1,2])
                .reset_index()
          )

print (df_agg)
   code        date  tank  flag_sum  qty_sold  time
0   123  2018-12-23     1         6       150     4
1   123  2018-12-23     2         4       150     3

关于python - 分组并减去 pandas 中的第一次出现和最后一次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54147055/

相关文章:

python - 如何使用 pandas 绘图

python - Pandas 计算每个索引的唯一值并将唯一行转换为汇总列

python - 克隆文档 mongoengine

python - 反转 python 2.7 中 difflib 的 get_matching_blocks 结果并获取 MISMATCHED block

python - 访问存储为列表的系列的每个元素

python - 将文件从Google Bucket加载到PyDub AudioSegment中

python - 放置仅由特定类引发的自定义 Python 异常的最佳实践位置

python - 从 pandas DataFrame 中删除名称包含特定字符串的第一(或任何第 n)列

python - 如何将一列中的所有列表编译成一个唯一列表

python - Scikit : Problem returning Dataframe from imputer instead of Numpy Array