Pandas df 差异数据必须是一维的
Pandas df difference data must be 1-dimensional
我正在尝试计算商店和商品组合的商品价格差异,如下所示:
index_cols = ['shop_id', 'item_id', 'date_block_num']
#get aggregated values for (shop_id, item_id, month)
gb = sales.groupby(index_cols).agg({'item_cnt_day':[np.sum], 'item_price':[np.mean]}).reset_index()\
.rename(columns={'sum': 'item_cnt_month','mean':'item_price'})
gb['diff'] = gb.groupby(['shop_id','item_id'])['item_price'].transform(np.diff).fillna(0)
gb
如您所见,我正在尝试使用 np.diff(来自 numpy)进行更快的计算,但我收到以下错误:
Exception: Data must be 1-dimensional
编辑:
数据样本:
shop_id item_id date_block_num item_cnt_day item_price
0 30 1 31.0 265.0
0 31 1 11.0 434.0
0 32 0 6.0 221.0
0 32 1 10.0 221.0
0 33 0 3.0 347.0
59 22164 27 2.0 699.0
59 22164 30 1.0 699.0
59 22167 9 1.0 299.0
59 22167 11 2.0 299.0
59 22167 17 1.0 299.0
有什么想法可以在使用 numpy 或更快的方法时避免此错误?谢谢
将 [np.mean]
和 [np.sum]
的一个元素列表删除到 np.mean
和 np.sum
以防止列中的 MultiIndex
:
gb = (sales.groupby(index_cols)
.agg({'item_cnt_day':np.sum, 'item_price':np.mean})
.reset_index()
.rename(columns={'sum': 'item_cnt_month','mean':'item_price'}))
然后是可能的用途(但不能 100% 确定性能是否更好):
gb['diff'] = gb.groupby(['shop_id','item_id'])['item_price'].diff()
编辑:
数据样本:
index_cols = ['shop_id', 'item_id', 'date_block_num']
sales = pd.DataFrame({
'item_id':list('aaaaaa'),
'shop_id':list('aaabbb'),
'date_block_num':[4,5,4,5,5,4],
'item_cnt_day':[7,8,9,4,2,3],
'item_price':[1,3,5,7,1,0]
})
gb = (sales.groupby(index_cols)
.agg({'item_cnt_day':[np.sum], 'item_price':[np.mean]})
.reset_index()
.rename(columns={'sum': 'item_cnt_month','mean':'item_price'}))
print (gb)
shop_id item_id date_block_num item_cnt_day item_price
item_cnt_month item_price
0 a a 4 16 3
1 a a 5 8 3
2 b a 4 3 0
3 b a 5 6 4
gb = (sales.groupby(index_cols)
.agg({'item_cnt_day':np.sum, 'item_price':np.mean})
.reset_index()
.rename(columns={'sum': 'item_cnt_month','mean':'item_price'}))
print (gb)
shop_id item_id date_block_num item_cnt_day item_price
0 a a 4 16 3
1 a a 5 8 3
2 b a 4 3 0
3 b a 5 6 4
我正在尝试计算商店和商品组合的商品价格差异,如下所示:
index_cols = ['shop_id', 'item_id', 'date_block_num']
#get aggregated values for (shop_id, item_id, month)
gb = sales.groupby(index_cols).agg({'item_cnt_day':[np.sum], 'item_price':[np.mean]}).reset_index()\
.rename(columns={'sum': 'item_cnt_month','mean':'item_price'})
gb['diff'] = gb.groupby(['shop_id','item_id'])['item_price'].transform(np.diff).fillna(0)
gb
如您所见,我正在尝试使用 np.diff(来自 numpy)进行更快的计算,但我收到以下错误:
Exception: Data must be 1-dimensional
编辑:
数据样本:
shop_id item_id date_block_num item_cnt_day item_price
0 30 1 31.0 265.0
0 31 1 11.0 434.0
0 32 0 6.0 221.0
0 32 1 10.0 221.0
0 33 0 3.0 347.0
59 22164 27 2.0 699.0
59 22164 30 1.0 699.0
59 22167 9 1.0 299.0
59 22167 11 2.0 299.0
59 22167 17 1.0 299.0
有什么想法可以在使用 numpy 或更快的方法时避免此错误?谢谢
将 [np.mean]
和 [np.sum]
的一个元素列表删除到 np.mean
和 np.sum
以防止列中的 MultiIndex
:
gb = (sales.groupby(index_cols)
.agg({'item_cnt_day':np.sum, 'item_price':np.mean})
.reset_index()
.rename(columns={'sum': 'item_cnt_month','mean':'item_price'}))
然后是可能的用途(但不能 100% 确定性能是否更好):
gb['diff'] = gb.groupby(['shop_id','item_id'])['item_price'].diff()
编辑:
数据样本:
index_cols = ['shop_id', 'item_id', 'date_block_num']
sales = pd.DataFrame({
'item_id':list('aaaaaa'),
'shop_id':list('aaabbb'),
'date_block_num':[4,5,4,5,5,4],
'item_cnt_day':[7,8,9,4,2,3],
'item_price':[1,3,5,7,1,0]
})
gb = (sales.groupby(index_cols)
.agg({'item_cnt_day':[np.sum], 'item_price':[np.mean]})
.reset_index()
.rename(columns={'sum': 'item_cnt_month','mean':'item_price'}))
print (gb)
shop_id item_id date_block_num item_cnt_day item_price
item_cnt_month item_price
0 a a 4 16 3
1 a a 5 8 3
2 b a 4 3 0
3 b a 5 6 4
gb = (sales.groupby(index_cols)
.agg({'item_cnt_day':np.sum, 'item_price':np.mean})
.reset_index()
.rename(columns={'sum': 'item_cnt_month','mean':'item_price'}))
print (gb)
shop_id item_id date_block_num item_cnt_day item_price
0 a a 4 16 3
1 a a 5 8 3
2 b a 4 3 0
3 b a 5 6 4