Как применить функцию, используя две Series в качестве входных данных с выходными данными, являющимися DataFrame функции-результата каждой комбинации аргументов? - PullRequest
2 голосов
/ 07 июня 2019

У меня есть две серии, каждая из которых содержит переменные, которые я хочу использовать в функции.Я хочу применить функцию для каждой комбинации переменных, при этом полученным результатом будет DataFrame вычисленных значений, индекс будет индексом одной серии, а столбцы будут индексом другой серии.

Я попытался найти ответ на похожую проблему - я уверен, что она есть, но я не уверен, как описать ее для поисковых систем.

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

Из того, что я прочитал, я представляю некоторую комбинацию понимания списка с заархивированными столбцами для вычисления значений,который затем преобразуется в DataFrame, но я не могу решить его таким образом.

Вот код для воспроизведения проблемы и текущее решение.

import pandas as pd

bands = pd.Series({'A': 5, 'B': 17, 'C': 9, 'D': 34}, name='band')
values = pd.Series({'Jan': 1, 'Feb': 1.02, 'Mar': 1.05, 'Apr': 1.12}, name='values')

# Here is an unused function as an example
myfunc = lambda x, y: x * (1 + 1/y)

def func1(values, bands):
    # Initialise empty DataFrame
    df = pd.DataFrame(index=bands.index, 
                             columns=values.index)

    for month, month_val in values.iteritems():
        for band, band_val in bands.iteritems():
            df.at[band, month] = band_val * (1/month_val - 1)

    return df

outcome = func1(values, bands)

1 Ответ

1 голос
/ 07 июня 2019

Вы можете использовать numpy.outer для этого:

import numpy as np
import pandas as pd

bands = pd.Series({'A': 5, 'B': 17, 'C': 9, 'D': 34}, name='band')
values = pd.Series({'Jan': 1, 'Feb': 1.02, 'Mar': 1.05, 'Apr': 1.12}, name='values')

outcome = pd.DataFrame(np.outer(bands, ((1 / values) - 1)),
                       index=bands.index,
                       columns=values.index)

[вне]

   Jan       Feb       Mar       Apr
A  0.0 -0.098039 -0.238095 -0.535714
B  0.0 -0.333333 -0.809524 -1.821429
C  0.0 -0.176471 -0.428571 -0.964286
D  0.0 -0.666667 -1.619048 -3.642857

Как функция:

def myFunc(ser1, ser2):
    result = pd.DataFrame(np.outer(ser1, ((1 / ser2) - 1)),
                          index=ser1.index,
                          columns=ser2.index)
    return result

myFunc(bands, values)
...