我有一個 df,你可以通過運行以下代碼來獲得它:
import numpy as np
import pandas as pd
from io import StringIO
dfs = """
M0 M1 M2 M3 M4 M5 age
1 1 2 3 4 5 6 3.2
2 7 5 4 5 8 3 4.5
3 4 8 9 3 5 2 6.7
"""
df = pd.read_csv(StringIO(dfs.strip()), sep='\s ', )
并且基于業務邏輯我有以下功能,輸出也是我所期望的:
def func(M0,M1,M2,M3,M4,M5,age):
newcol=np.prod([M0,M1,M2,M3,M4,M5][0:age])
return newcol
vfunc = np.frompyfunc(func, 7, 1)
df['newcol']=vfunc(df['M0'].values,df['M1'].values,df['M2'].values,df['M3'].values,df['M4'].values,df['M5'].values,df['age'].values.astype(int))
df
輸出是:
M0 M1 M2 M3 M4 M5 age newcol
1 1 2 3 4 5 6 3.2 6
2 7 5 4 5 8 3 4.5 700
3 4 8 9 3 5 2 6.7 8640
問題是這里 def func(M0,M1,M2,M3,M4,M5,age) 中的引數太多,無論如何我可以將這些引數設為串列或其他東西以使函式更干凈嗎?
我試過:
def func(df):
newcol=np.prod
([df['M0'].values,df['M1'].values,df['M2'].values,df['M3'].values,df['M4'].values,df['M5'].values][0:df['age'].values.astype(int)])
return newcol
vfunc = np.frompyfunc(func,1, 1)
df['newcol']=vfunc(df)
錯誤:
TypeError: 'float' object is not subscriptable
請注意我不使用 pd.apply()的原因,是因為在我的實際業務中資料非常大并且 pd.apply() 運行非常緩慢。
uj5u.com熱心網友回復:
這不是優化的,但至少在選擇 M 列方面可以更具可讀性,盡管它有一個額外的功能:
M=["M0","M1","M2","M3","M4","M5"]
def func2(df, M):
return [df[i].values for i in M]
def func(age,*Ms):
newcol=np.prod(Ms[0:age])
return newcol
vfunc = np.frompyfunc(func, len(M) 1, 1)
df['newcol']=vfunc(df['age'].values.astype(int), *func2(df,M))
df
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/371460.html
標籤:Python 熊猫 麻木的 矢量化 numpy-ndarray
上一篇:過濾熊貓資料框-頂部和底部N行
下一篇:根據分組創建一個pandas列
