Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.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 对具有多个输入的函数使用df.apply生成多个输出_Python_Pandas - Fatal编程技术网

Python 对具有多个输入的函数使用df.apply生成多个输出

Python 对具有多个输入的函数使用df.apply生成多个输出,python,pandas,Python,Pandas,我有一个像这样的数据框 initial year0 year1 0 0 12 1 1 13 2 2 14 3 3 15 请注意,year列的数目year0、year1。。。(year_count)是完全可变的,但在整个代码中是不变的 我首先想对每个“year”列应用一个函数来生成“mod”列,如下所示 def mod(year, scalar): return (year * scalar) s = 5

我有一个像这样的数据框

initial year0 year1
0       0     12
1       1     13
2       2     14
3       3     15
请注意,year列的数目year0、year1。。。(year_count)是完全可变的,但在整个代码中是不变的

我首先想对每个“year”列应用一个函数来生成“mod”列,如下所示

def mod(year, scalar):
    return (year * scalar)

s = 5
year_count = 2
# Generate new columns
df[[f"mod{y}" for y in range (year_count)]] = df[[f"year{y}" for y in range(year_count)]].apply(mod, scalar=s)  

initial year0 year1 mod0 mod1
0       0     12    0   60
1       1     13    5   65
2       2     14    10  70
3       3     15    15  75

到目前为止一切都很好。问题是我现在想对year列和它对应的mod列应用另一个函数来生成另一组val列,比如

def sum_and_scale(year_col, mod_col, scale):
    return (year_col + mod_col) * scale
df[['val0', 'val1']] = df['col1', 'col2'].apply(lambda x: sum_and_scale('mod0', 'mod1', scale=10))
然后我将其应用于每个列(year0,mod0),(year1,mod1)等,以生成下一批列

当比例=10时,我应该以

initial year0 year1 mod0 mod1 val0 val1
0       0     12    0    60   0    720
1       1     13    5    65   60   780
2       2     14    10   70   120  840
3       3     15    15   75   180  900
这就是我遇到的问题——我不知道如何将两个现有的df列放在一个与第一个示例中的结构相同的函数中,如果我这样做的话

def sum_and_scale(year_col, mod_col, scale):
    return (year_col + mod_col) * scale
df[['val0', 'val1']] = df['col1', 'col2'].apply(lambda x: sum_and_scale('mod0', 'mod1', scale=10))
我不知道如何将其推广到具有任意输入和输出,以及应用常量比例参数。(我知道最后一条不起作用,但这是我见过的解决方案的另一条途径)

我问这个问题的原因是因为我相信我目前正在进行的循环会造成列数和每列长度的性能问题


谢谢

IMHO,使用一个简单的for循环会更好:

for i in range(2):
    df[f'val{i}'] = sum_and_scale(df[f'year{i}'], df[f'mod{i}'], scale=10)

sum\u and\u scale
是您的实际功能还是只是一个模型?它是一个模型,我认为使实际函数工作所需的最小值,这是我应该提到的更为复杂的一点——我提出这个问题的原因是因为我相信循环会在列的数量和每列的长度方面产生性能问题。在这种情况下,你有一个最小的循环,所以它不会太复杂糟糕。对于每个列,函数仍然是矢量化的。也就是说,
apply
本身本质上也是一个循环。