【问题标题】:how to groupby and merge in pandas如何在熊猫中分组和合并
【发布时间】:2018-12-10 15:06:17
【问题描述】:

我在熊猫中有以下数据框

  Date          Time   Tank       Sales       Quantity        Delivery
  2018-01-01    06:30  1          100         3444            0      
  2018-01-01    07:00  1          200         3144            0
  2018-01-01    05:30  1          100         2900            0      
  2018-01-01    07:30  1          200         2800            0
  2018-01-01    06:30  2          50          3000            0      
  2018-01-01    07:00  2          100         2950            0
  2018-01-01    05:30  2          150         2800            0      
  2018-01-01    07:30  2          100         2704            0
  2018-01-02    06:30  1          100         3444            0      
  2018-01-02    07:00  1          200         3144            0
  2018-01-02    05:30  1          100         2900            50      
  2018-01-02    07:30  1          200         2800            0
  2018-01-02    06:30  2          50          3000            0      
  2018-01-02    07:00  2          100         2950            0
  2018-01-02    05:30  2          150         2800            50     
  2018-01-02    07:30  2          100         2704            0

我想汇总一天和油箱级别以获得当天的第一和最后数量(按升序排列时间)以及销售和交付的总和。我想要的数据框是

  Date          Tank    Open    Close   Sales    Delivery
  2018-01-01    1       2900    2800    600      0         
  2018-01-01    2       2800    2704    400      0          
  2018-01-02    1       2900    2800    600      50     
  2018-01-02    2       2800    2704    500      50

目前我正在关注熊猫

这是为了按升序获取第一个和最后一个数量日和油箱液位排列时间。

  data_open_close_inv = data.sort_values(['Date','Tank','Time']).groupby(['Date','Tank'])['Quantity'].agg(['first','last']).reset_index()

然后我将其汇总为销售和交付的总和

data_agg = data.groupby(['Date','Tank'], as_index = False).agg({'Sales':['sum'],'Delivery':['sum']}).reset_index()

然后再次将两者结合起来。

我可以在 pandas 中一步完成所有事情吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以传递带有标量函数名称的字典和列表,但有必要展平 MultiIndex 和 rename 列:

    data_open_close_inv = (data.sort_values(['Date','Tank','Time'])
                               .groupby(['Date','Tank'])
                               .agg({'Sales':'sum','Delivery':'sum', 'Quantity':['first','last']})
                               .reset_index())
    
    data_open_close_inv.columns = data_open_close_inv.columns.map(''.join)
    d = {'Salessum':'Sales',
         'Delivery_sum':'Delivery',
         'Quantityfirst':'Open',
         'Quantitylast':'Close',
         }
    data_open_close_inv = data_open_close_inv.rename(columns=d)
    print (data_open_close_inv)
            Date  Tank  Sales  Deliverysum  Open  Close
    0 2018-01-01     1    600            0  2900   2800
    1 2018-01-01     2    400            0  2800   2704
    2 2018-01-02     1    600           50  2900   2800
    3 2018-01-02     2    400           50  2800   2704
    

    【讨论】:

    • 我们还能计算每个日期和油箱液位的唯一Time 吗?会是.agg({'Time': 'count'})`?
    • @Neil - 我认为需要.agg({'Time': 'nunique'}), nunique
    • 我们还能在同一个聚合函数中获得Time 的重复计数吗?
    • @Neil - 如果需要所有计数然后.agg({'Time': 'count'}),如果只需要计数重复times 使用.agg({'Time': lambda x: x.duplicated(keep=False).sum()})
    • 当我尝试关注'Time':['nunique'],'Time':lambda x: x.duplicated(keep=False).sum()}) 它说Dictionary key is repeated with different values
    猜你喜欢
    • 2018-11-07
    • 2022-09-27
    • 2021-12-14
    • 2018-03-15
    • 2020-04-18
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多