[英]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 中的b , df2 中的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.