python:如何从函数返回DataFrame或列表?

时间:2017-03-07 21:37:46

标签: python pandas

这个问题很有可能被复制,但我还没有找到答案。但是,我试图将一个函数应用于pandas DataFrame,我想要一个DataFrame。以下示例是可重现的:

msgResult

我的功能:

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) result1获取DataFrame或列表?

3 个答案:

答案 0 :(得分:0)

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)

答案 1 :(得分: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

答案 2 :(得分:0)

你可以通过在函数中声明它来创建一个全局变量,然后从中创建一个数据框

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]})