在熊猫中使用自定义聚合函数在数据框中创建新列

时间:2020-06-23 22:06:57

标签: python pandas dataframe aggregate

假设我有一个像这样的熊猫数据框:

         Date  Type  Rate  Load
0  2017-01-02  Rain    23    10
1  2017-01-02   Dry    30    15
2  2017-01-02  Rain    32    20
....

我还有一个成本函数 cost(Type, Rate)返回一些实数。

如何创建一个新列,为每一行计算Load的所有其他行的总和,这些其他行的Date相同,而该行的cost()较少。

例如,如果成本函数很简单:

def cost(Type, Rate):
    if Type=='Rain':
        return Rate/12
    else:
        return Rate/17

输出将是:

         Date  Type  Rate  Load  Output
0  2017-01-02  Rain    23    10   15           
1  2017-01-02   Dry    30    15   0          
2  2017-01-02  Rain    32    20   15+10=25    
....

更新。我正在考虑的当前方法是创建一个新列,该列首先计算每一行的cost,然后在下一步中,创建一个新列,该列汇总具有以下内容的每一行的所有记录:同一日期,且费用较低。但是,有没有更快的方法将这两种方法结合起来?

2 个答案:

答案 0 :(得分:0)

row_sum = df.groupby(["Date"]).sum()
costs = [row_sum[row_sum["Date"] == i["Date"]] - cost(i["Type"], i["Rate"]) for i in df.iterrows()])

df["Output"] = costs

答案 1 :(得分:0)

您可以尝试使用df.to_records()

print(df)
cost= lambda Type, Rate:  Rate/12 if Type=='Rain' else Rate/17

l=[sum([j[4] for j in df.to_records() if list(j)[1]==list(i)[1] and list(i)!=list(j) and cost(list(j)[2],list(j)[3])<cost(list(i)[2],list(i)[3])]) for i in df.to_records()]
df['Output']=l
print(df)

输出:

df:
        Date  Type  Rate  Load
0 2017-01-01  Rain    23    10
1 2017-01-01   Dry    22    10
2 2017-01-01  Rain    25    10
3 2017-01-02   Dry    30    15
4 2017-01-02  Rain    32    20

df with output column:
        Date  Type  Rate  Load  Output
0 2017-01-01  Rain    23    10      10
1 2017-01-01   Dry    22    10       0
2 2017-01-01  Rain    25    10      20
3 2017-01-02   Dry    30    15       0
4 2017-01-02  Rain    32    20      15