Нужна помощь в создании Pandas Dataframe путем передачи динамического списка аргументов c в функцию - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть таблица 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'} 

Значение x в столбце col1 рассчитывается с помощью операции add в столбце col2 с использованием параметров ключ: значение пары в столбце столбца 3 ( a in df1 , l in df2 , ...)

Аналогично значение y в столбце col1 следует вычислять с помощью операции sub в столбце col2 с использованием параметров в столбце col3 ( b в df1 , m in df2 ); количество пар k: v в Col3 может быть больше или меньше в зависимости от операции / функции, определенной в столбце 2, например, для sqrt только 1 пара

Я хочу получить вывод в виде фрейма данных df4, как упомянуто ниже

 x                           y                      z

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


Я пытаюсь добиться этого путем создания функции, как указано ниже, но я не уверен, как мне построить и передать Dynami c список аргументов этой функции, где количество передаваемых аргументов зависит от количества пар k: v , назначенных в col3? В моем случае для добавить у меня есть 3, а для sub у меня есть 2 и для sqrt , у меня есть только 1

</p>

<p>for ix,row in df3.iterrows():</p>

<code>          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> )
</code>

1 Ответ

0 голосов
/ 25 февраля 2020
# 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])

et c .

Это не похоже на правильное использование pandas, но я не уверен в размере вашего фактического набора данных.

...