簡體   English   中英

Python:如何從函數返回DataFrame或列表?

[英]python: how to return a DataFrame or a list from a function?

這個問題有很大的機會被重復,但我還沒有找到答案。 但是,我正在嘗試將函數應用於pandas DataFrame,並且我想恢復一個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)

以及如何使它運行? 我的意思是要獲得一個帶有result1result2的DataFrame或列表?

apply將根據您提供的axis參數返回每行或每列一些值(我相信您已經理解了這一點,因為您提供的axis arg為1)。

從apply返回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)

您可以在返回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

您可以通過在函數中進行聲明來創建全局變量,然后從中創建數據框

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)
global  df ### declaring global variable
df=pd.DataFrame({'r1': [result1],'r2': [result2]})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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