簡體   English   中英

通過將動態參數列表傳遞給函數,需要有關 Pandas Dataframe 創建的幫助

[英]Need help on Pandas Dataframe creation by passing a dynamic argument list to a function

我有一個表 T1,如下所示(存儲為數據框 df3,列 col1、col2 和 col3)

df2 有列 'l', 'm', 'n'...

df1 有列 'a', 'b', 'c'

col1       col2       col3

x            add       {'a':'df1','l':'df2','n':'df2'}

y            sub        {'b':'df1','m':'df2'} 

z            sqrt       {'c': 'df1'}

col1 中的值x將使用 col2 中的操作add計算,使用參數key:value對 col3 ( a in df1 , l in df2 , ...)

同樣,col1 中的值y將使用 col2 中的操作sub使用 col3 中的參數( df1 中的bdf2 中的m )來計算; Col3 中k:v對的數量可能更多或更少,具體取決於 col 2 中定義的操作/函數,例如sqrt ,只有 1 對

我想以數據幀 df4 的形式獲取輸出,如下所述

x                           y                      z

df1['a']+df2['l']+df2['n']   df1['b'] - df2['m']    df1['c]

我正在嘗試通過構建如下所述的函數來實現這一點,但我不確定如何構建動態參數列表並將其傳遞給該函數,其中要傳遞的參數數量取決於在 col3 中分配的k:v對的數量? 在我的情況下,對於add我有 3 個,對於sub我有 2 個,而對於sqrt ,我只有 1 個

for ix,row in df3.iterrows():

call_operation = row['col2'] target_value = row['col1'] #df4[target_value] = getattr(module,call_operation)(df2[b],df1[a]) df4[target_value] = getattr(module,call_operation)( <dynamic argument list form col3> )
# dummy data
df1 = pd.DataFrame({'a': [1, 2, 3]})
df2 = pd.DataFrame({'l': [4, 5, 6],
                    'n': [7, 8, 9]})

# get your dfs in a list so we can call them by name
dfs = {'df1': df1, 'df2': df2}

# let's say you are in your for loop on the first row:
ix = 0
target_name = 'x'
call_operation = 'sum'
col3 = {'a': 'df1', 'l': 'df2', 'n': 'df2'}

# actual logic:
vars = []
for k, v in col3.items():
    vars.append(dfs[v][k].iloc[ix])
results['target_name'].iloc[ix] = getattr(__builtin__, call_operation)(vars)

根據您在實際數據中擁有多少類型的操作,您可以使用getattr()if語句或兩者的組合。

if call_operation == 'sqrt':
    getattr(math, 'sqrt')(vars[0])

等等。

雖然這感覺不像是正確使用pandas ,但我不確定您的實際數據集的大小。

暫無
暫無

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

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