Многократная итерация операций по столбцам фрейма данных (применить функцию?)

#pandas #function #dataframe #iteration #apply

#pandas #функция #фрейм данных #итерация #применить

Вопрос:

У меня есть фрейм данных pandas с тысячами столбцов, и я хотел бы выполнить следующие операции для каждого столбца фрейма данных:

  1. проверьте, находятся ли значения i -го и i-1 -го в диапазоне (между x и y );
  2. если выполняется # 1, то найдите log(i/i-1) ** 2 столбец;
  3. если #1 не выполняется, предположим, что 0;
  4. найдите общее количество # 2 для каждого столбца.

Вот фрейм данных с одним столбцом:

 d = {'col1': [10, 15, 23, 16, 5, 14, 11, 4]}
df = pd.DataFrame(data = d)
df
  

x = 10 и y = 20

Вот что я могу сделать для этого одного столбца:

 df["IsIn"] = "NA" 
for i in range(1, len(df.col1)):
    if (x < df.col1[i] < y) amp; (x < df.col1[i - 1] < y):
        df.IsIn[i] = 1
    else:
        df.IsIn[i] = 0

df["rets"] = np.log(df["col1"] / df["col1"].shift(1))
df["var"] = df["IsIn"] * df["rets"]**2
Total = df["var"].sum()
Total
  

В идеале у меня был бы фрейм данных (1 на n-cols) Totals для каждого столбца. Как я могу наилучшим образом добиться этого? Я также был бы признателен, если бы вы могли дополнить свой ответ подробным объяснением.

Ответ №1:

Да, это тот случай, когда apply работает. Вам нужно только обернуть свою логику в функцию. Кроме того, рассмотрите between и shift условие устранения первого цикла:

 def func(s, x=10, y=20):
    '''
    compute the value given a series
    ''' 

    # mask where values are between x and y
    valid = s.between(x,y)

    # shift `valid` and double check
    valid = valid amp; valid.shift(fill_value=False)

    # squared log, mask with `valid`, and sum
    return (np.log(s/s.shift())**2 * valid).sum()

# apply `func` on the columns
df.apply(func, x=10, y=20)
  

Вывод:

 col1    0.222561
dtype: float64