簡體   English   中英

使用 pandas 中的自定義聚合 function 在 dataframe 中創建新列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM