[英]Pandas dataframe: creating a new column that is a custom function using 2 other columns
[英]create new column in a dataframe using custom aggregate function in pandas
假設我有一個 pandas 數據框,例如:
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
....
我還有一個成本 function cost(Type, Rate)
返回一些實數。
如何創建一個新列,為每一行計算Load
所有其他行的總和,該行具有相同的Date
並且該給定行的cost()
較少。
例如,如果成本 function 很簡單:
def cost(Type, Rate):
if Type=='Rain':
return Rate/12
else:
return Rate/17
output 將是:
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
,然后在下一步創建一個新列,匯總具有相同日期的每一行的所有記錄,並且成本更低。 但是有沒有更快的方法來結合這兩者?
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
你可以用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)
Output:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.