Python 如何在熊猫中进行分组和合并
我在熊猫中有以下数据帧Python 如何在熊猫中进行分组和合并,python,pandas,Python,Pandas,我在熊猫中有以下数据帧 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
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
目前我正在做以下的熊猫
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
用于按升序获取第一个和最后一个数量日和储罐液位安排时间
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中一步完成所有操作吗?您可以传递一个带有标量函数名和列表的字典,但需要展平多索引和重命名列:
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
我们还可以计算每个日期和油箱液位的唯一时间吗?是不是
.agg({'Time':'count'
})`?@Neil-我想需要.agg({'Time':'nunique'})
,我们能不能在同一个聚合函数中得到时间的重复计数?@Neil-如果需要所有计数,那么.agg({'Time':'count'})
,如果只想重复时间,请使用.agg({'Time':lambda x:x.duplicated(keep=False).sum()})
当我尝试执行以下操作时,'Time':['nunique'],'Time':lambda x:x.duplicated(keep=False).sum()}
它说字典键用不同的值重复