Панды: применить функцию к определенным значениям строк и индексам - PullRequest
0 голосов
/ 25 августа 2018

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

Date        Athlete  Load
2016-01-04  Alan     180
2016-01-04  Ben      61
2016-01-04  David    186
2016-01-04  Joe      99
2016-01-04  John     131

Мне удалось отфильтровать предметы по имени и создать новые фреймы данных для каждого.

for athlete in df['Athlete'].unique():
    athlete = df.loc[ewma['Athlete'] == athlete]
    print(athlete.head())

Часть, с которой у меня возникла проблема - это уравнение для вычисления нового столбца. Первое значение вычисляется из первой измеренной переменной, но каждое последующее значение использует значение предыдущего дня.

Например, первая строка нового столбца будет использовать:

x = (df['Load'].iloc[0] * 2) - (df['Load'].iloc[0] / 2)

х = 180

Во второй строке будет использоваться значение предыдущего дня (x) вместо второго значения df ['Load']. Мне удалось правильно рассчитать второе значение с помощью базовой функции:

y = (df['Load'].iloc[1] * 2) - (x / 2)

у = 168

Я пытался использовать 'if / else', но он не вычислял правильные значения.

if df.index.name == '0':
    (df['Load'].iloc[0] * 2) - (df['Load'].iloc[0] / 2)
else:
     (df['Load'] * 2) - (df['Load'].shitf(-1) / 2)

Любые рекомендации будут с благодарностью.

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Если вы хотите исключить первую строку, а затем:

previous_row = next_row * 2 - previous_row/2

может быть достигнуто так:

"""
(row n-1) = (row n) * 2 -  (row n-1) /2  except for row0.
"""
import pandas as pd 
df = pd.read_csv('data.txt',delim_whitespace=True)

df['new'] = df.Load * 2 - df.Load.shift(1)/2
df.loc[0,'new'] = df.Load[0]
df

Результат:

    Date        Athlete Load    new
0   2016-01-04  Alan    180     180.0
1   2016-01-04  Ben     61      32.0
2   2016-01-04  David   186     341.5
3   2016-01-04  Joe     99      105.0
4   2016-01-04  John    131     212.5
0 голосов
/ 26 августа 2018

Это должно сделать это:

def update_row(df):
    row_tmp = {"next_row": None}
    def updater(row):
        last_row_id = row.name - 1
        if row.name == 0:
            row_tmp['next_row'] = (row['Load'] * 2) - (row['Load'] /2.0)
            return row_tmp['next_row']
        row_tmp['next_row'] = (2* row['Load']) - (row_tmp['next_row']/2.0)
        return row_tmp['next_row']
    return updater


df

Date    Athlete Load
0   2016-01-04  Alan    180
1   2016-01-04  Alan    0
2   2016-01-04  Alan    123
3   2016-01-04  Alan    71
4   2016-01-04  Alan    137
5   2016-01-04  Alan    0
6   2016-01-04  Alan    0


df.apply(update_row(df), axis=1)

0    270.00000
1   -135.00000
2    313.50000
3    -14.75000
4    281.37500
5   -140.68750
6     70.34375
dtype: float64

PS, я считаю, что ваш расчет для x и y не точный, x должен быть 270, а y должен быть -13 на основе вашей формулы!

...