пропорции строк данных в пандах - PullRequest
0 голосов
/ 23 октября 2018

У меня есть фрейм данных с несколькими столбцами и строками

Для всех столбцов мне нужно сказать, что значение строки равно 0,5 этой строки + 0,5 значения строки перед значением.

IВ настоящее время настроен цикл, который работает.Но я чувствую, что есть лучший способ без использования петли.У кого-нибудь есть мысли?

dataframe = df_input

df_output=df_input.copy()
for i in range(1, df_input.shape[0]):
    try:
        df_output.iloc[[i]]= (df_input.iloc[[i-1]]*(1/2)).values+(df_input.iloc[[i]]*(1/2)).values
    except:
        pass

Ответы [ 3 ]

0 голосов
/ 23 октября 2018
df.rolling(window=2, min_periods=1).apply(lambda x: x[0]*0.5 + x[1] if len(x) > 1 else x)

Это будет делать ту же операцию для всех столбцов.

Объяснение: Для каждого подвижного объекта лямбда выбирает столбцы, а x структурируется как [this_col[i], this_col[i+1]] для всех столбцов, а затем выполняетПользовательская арифметика проста.

0 голосов
/ 23 октября 2018

Некоторые

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(low=0, high=10, size=(5, 1)), columns=['a'])
df["cumsum_a"] = 0.5*df["a"].cumsum() + 0.5*df["a"]

как показано ниже?

0 голосов
/ 23 октября 2018

Вы имеете в виду что-то вроде этого:

Первое создание тестовых данных:

np.random.seed(42)

df = pd.DataFrame(np.random.randint(0, 20, [5, 3]), columns=['A', 'B', 'C'])

    A   B   C
0   6  19  14
1  10   7   6
2  18  10  10
3   3   7   2
4   1  11   5

Запрошенная вами функция:

(df*.5).rolling(2).sum()

      A     B     C
0   NaN   NaN   NaN
1   8.0  13.0  10.0
2  14.0   8.5   8.0
3  10.5   8.5   6.0
4   2.0   9.0   3.5

РЕДАКТИРОВАТЬ: для несбалансированной суммы вы можете определить вспомогательную функцию:

def weighted_mean(arr):
    return sum(arr*[.25, .75])

df.rolling(2).apply(weighted_mean, raw=True)

       A      B     C
0    NaN    NaN   NaN
1   9.00  10.00  8.00
2  16.00   9.25  9.00
3   6.75   7.75  4.00
4   1.50  10.00  4.25

EDIT2: ... и если веса должны быть установлены во время выполнения:

def weighted_mean(arr, weights=[.5, .5]):
    return sum(arr*weights/sum(weights))

Нет дополнительных аргументов по умолчанию для сбалансированного среднего:

df.rolling(2).apply(weighted_mean, raw=True)

      A     B     C
0   NaN   NaN   NaN
1   8.0  13.0  10.0
2  14.0   8.5   8.0
3  10.5   8.5   6.0
4   2.0   9.0   3.5

Несбалансированное среднее:

df.rolling(2).apply(weighted_mean, raw=True, args=[[.25, .75]])

       A      B     C
0    NaN    NaN   NaN
1   9.00  10.00  8.00
2  16.00   9.25  9.00
3   6.75   7.75  4.00
4   1.50  10.00  4.25

Деление на sum(weights) позволяет определять веса, не ограничиваясь только дробямиодин, но в любом соотношении:

df.rolling(2).apply(weighted_mean, raw=True, args=[[1, 3]])

       A      B     C
0    NaN    NaN   NaN
1   9.00  10.00  8.00
2  16.00   9.25  9.00
3   6.75   7.75  4.00
4   1.50  10.00  4.25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...