Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:如何从函数返回数据帧或列表?_Python_Pandas - Fatal编程技术网

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

python:如何从函数返回数据帧或列表?,python,pandas,Python,Pandas,这个问题很有可能被重复,但我还没有找到答案。然而,我正在尝试将一个函数应用于一个数据帧,我希望返回一个数据帧。以下示例是可复制的: df = pd.DataFrame({'ID': ["1","2"], 'Start': datetime.strptime('20160701', '%Y%m%d'), 'End': datetime.strptime('20170701', '%Y%m%d'),

这个问题很有可能被重复,但我还没有找到答案。然而,我正在尝试将一个函数应用于一个数据帧,我希望返回一个数据帧。以下示例是可复制的:

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
result2

apply
将根据您提供的
axis
参数,每行或每列返回一些值(我相信您已经理解了这一点,因为您提供了一个
axis
参数1)

从apply返回数据帧是有问题的。您可能要做的是创建一个新列,其中包含您正在应用的函数返回的值

差不多

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)

apply
将在每行或每列返回一些值,具体取决于您提供的
axis
参数(我相信您已经理解了这一点,因为您提供的是
axis
arg值为1)

从apply返回数据帧是有问题的。您可能要做的是创建一个新列,其中包含您正在应用的函数返回的值

差不多

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

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

可以通过在函数中声明全局变量来创建全局变量,然后从中创建数据帧

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

啊,是的,那也是固体。啊,是的,那也是固体。