假设我有一个像这样的熊猫数据框:
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
,然后在下一步中,创建一个新列,该列汇总具有以下内容的每一行的所有记录:同一日期,且费用较低。但是,有没有更快的方法将这两种方法结合起来?
答案 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