2017-03-07 792 views
0

這個問題有很大的機會被重複,但我還沒有找到答案。不過,我試圖將一個函數應用於熊貓DataFrame,並且我想要返回一個DataFrame。其次例子是重複性:python:如何從函數返回一個DataFrame或列表?

df = pd.DataFrame({'ID': ["1","2"], 
        'Start': datetime.strptime('20160701', '%Y%m%d'), 
        'End': datetime.strptime('20170701', '%Y%m%d'), 
        'Value': [100, 200], 
        'CreditNote': [-20, -30]}) 

我的功能:

def act_value_calc(x): 
    start_delta = (x.Start.replace(day=31,month=12) - x.Start).days 
    full_delta = (x.End - x.Start).days 
    result1 = round((x.Value + x.CreditNote)/full_delta * start_delta, 2) 
    result2 = round((x.Value + x.CreditNote) - result1, 2) 
    return(pd.DataFrame({'r1': [result1],'r2': [result2]})) 

爲什麼我不能運行下面的代碼...

df.apply(act_value_calc, 1) 

,應該怎麼做才能讓它運行?我的意思是獲得一個DataFrame或列表返回result1result2

回答

0

而返回pandas.Series代替pandas.DataFrame你可以更容易爲自己:

def act_value_calc(x): 
    start_delta = (x.Start.replace(day=31,month=12) - x.Start).days 
    full_delta = (x.End - x.Start).days 
    result1 = round((x.Value + x.CreditNote)/full_delta * start_delta, 2) 
    result2 = round((x.Value + x.CreditNote) - result1, 2) 
    return(pd.Series({'r1': result1,'r2': result2})) 

print(df.apply(act_value_calc, 1)) 
    r1  r2 
0 40.11 39.89 
1 85.23 84.77 
+0

啊是啊,這固得。 –

+0

這就是我正在尋找的..謝謝! – Codutie

0

apply將根據您提供的參數axis(我相信您明白這一點,因爲您已提供axis參數值爲1),將每行或每列返回一些值。

從應用程序返回DataFrame存在問題。你可能想要做的是創建一個新的列,其中由您正在應用的函數返回。

喜歡的東西

def act_value_calc1(x): 
    start_delta = (x.Start.replace(day=31,month=12) - x.Start).days 
    full_delta = (x.End - x.Start).days 
    result1 = round((x.Value + x.CreditNote)/full_delta * start_delta, 2) 
    return result1 

def act_value_calc2(x): 
    start_delta = (x.Start.replace(day=31,month=12) - x.Start).days 
    full_delta = (x.End - x.Start).days 
    result2 = round((x.Value + x.CreditNote) - x.result1, 2) 
    return result2 

df['result1'] = df.apply(act_value_calc1, axis=1) 
df['result2'] = df.apply(act_value_calc2, axis=1) 
相關問題