簡體   English   中英

在具有多個輸入的函數上使用 df.apply 以生成多個輸出

[英]Using df.apply on a function with multiple inputs to generate multiple outputs

我有一個看起來像這樣的數據框

initial year0 year1
0       0     12
1       1     13
2       2     14
3       3     15

請注意,年份列的數量 year0, year1... (year_count) 是完全可變的,但在整個代碼中將保持不變

我首先想對每個“年份”列應用一個函數來生成像這樣的“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

然后我將其應用於每一列 (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 列放在一個與第一個示例具有相同結構的函數中,如果我執行類似的操作

df[['val0', 'val1']] = df['col1', 'col2'].apply(lambda x: sum_and_scale('mod0', 'mod1', scale=10))

我不知道如何將其概括為具有任意輸入和輸出並應用恆定比例參數。 (我知道最后一條不起作用,但這是我見過的解決方案的另一條途徑)

我問的原因是因為我相信我目前正在使用的循環會產生列數和每列長度的性能問題。

謝謝

恕我直言,最好使用簡單的for循環:

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

暫無
暫無

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

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