我仍在努力真正熟悉熊猫groupby
操作。将函数传递给 时agg
,如果传递的聚合函数需要考虑除正在聚合的列之外的列中的值怎么办。
考虑以下数据框示例,该示例列出了两名销售员的产品销售情况:
DateList = np.array( [(datetime.date.today() - datetime.timedelta(7)) + datetime.timedelta(days = x) for x in [1, 2, 2, 3, 4, 4, 5]] + \
[(datetime.date.today() - datetime.timedelta(7)) + datetime.timedelta(days = x) for x in [1, 1, 2, 3, 4, 5, 5]]
Names = np.array(['Joe' for x in xrange(7)] + ['John' for x in xrange(7)])
Product = np.array(['Product1', 'Product1', 'Product2', 'Product2', 'Product2', 'Product3', 'Product3', \
'Product1', 'Product2', 'Product2', 'Product2', 'Product2', 'Product2', 'Product3'])
Volume = np.array([100, 0, 150, 175, 15, 120, 150, 75, 0, 115, 130, 135, 10, 120])
Prices = {'Product1' : 25.99, 'Product2': 13.99, 'Product3': 8.99}
SalesDF = DataFrame({'Date' : DateLists, 'Seller' : Names, 'Product' : Product, 'Volume' : Volume})
SalesDF.sort(['Date', 'Seller'], inplace = True)
SalesDF['Prices'] = SalesDF.Product.map(Prices)
在某些日子里,每个卖家都销售不止一件商品。假设您想将数据集聚合到单日/卖家观察中,并且您希望根据销售量最大的产品来这样做。需要明确的是,这对于体积测量来说很简单,只需将 max 函数传递给 agg。然而,评估保留哪个产品和价格意味着确定哪个体积度量最高,然后返回与该最大值相对应的值。
我可以通过使用在调用 agg 时传递给函数的列中的索引值并引用基础数据框来获得我想要的结果:
def AggFunc(x, df, col1):
#Create list of index values that index the data in the column passed as x
IndexVals = list(x.index)
#Use those index values to create a list of the values of col1 in those index positions in the underlying data frame.
ColList = list(df[col1][IndexVals])
# Find the max value of the list of values of col1
MaxVal = np.max(ColList)
# Find the index value of the max value of the list of values of col1
MaxValIndex = ColList.index(MaxVal)
#Return the data point in the list of data passed as column x which correspond to index value of the the max value of the list of col1 data
return list(x)[MaxValIndex]
FunctionDict = {'Product': lambda x : AggFunc(x, SalesDF, 'Volume'), 'Volume' : 'max',\
'Prices': lambda x : AggFunc(x, SalesDF, 'Volume')}
SalesDF.groupby(['Date', "Seller"], as_index = False).agg(FunctionDict)
但是我想知道是否有更好的方法可以将“Volume”作为参数传递给聚合产品的函数,而无需获取索引值并从基础数据框中的数据创建列表?有些东西告诉我不,因为agg
将每一列作为一个系列传递给聚合函数,而不是数据框本身。
有任何想法吗?
谢谢