сравните текущее значение столбца с предыдущим значением в фрейме данных pandas и сохраните результат в другом столбце - PullRequest
0 голосов
/ 10 июля 2019

У меня есть датафрейм pandas со значениями вроде

    Date     Col1  col2
    20000101 0.5   0
    20000102 0.5   0.5
    20000103 0     0.25
    20000104 0.5   0.5

требуемый выход

    Date     Col1  col2  col1_1 col2_2
    20000101  0.5  0     Buy    NA
    20000102  0.5  0.5   Hold   Buy
    20000103  0    0.25  Sell     Sell
    20000104  0.5  0.5   Buy    Buy

Используя логику, если текущий вес больше, чем предыдущий, затем введите «Buy», в случае отсутствия изменений, затем «Hold» или, если ниже, чем предыдущий, затем вставьте «Sell»

Я использовал логику

for i in range(1, len(df)):
    if i == 1:
        df.loc[0, 'col1'] = 0
    c = df.loc[i, 'col1']
    p = df.loc[i-1, 'col1']

    if c == p:
        df.loc[i, 'col1_1'] = 'Hold'
    elif c > p:
        df.loc[i, 'col1_1'] = 'Buy'
    elif c < p:
        df.loc[i, 'col1_1'] = 'Sell'
    else:
        df.loc[i, 'col1'] = 'NA'

Используя это, я не получаю желаемый результат.

1 Ответ

0 голосов
/ 10 июля 2019

Поскольку у вас несколько условий, мы используем np.select. Для сравнения предыдущей строки с текущей строкой мы используем .shift. И поскольку вы хотите применить одну и ту же логику к нескольким столбцам, мы определяем функцию, чтобы избежать дублирования кода:

def insert_logic(dataframe, col):

    m1 = dataframe[col] > dataframe[col].shift()
    m2 = dataframe[col].eq(dataframe[col].shift())
    m3 = dataframe[col] < dataframe[col].shift()

    df[f'{col}_{col[-1:]}'] = np.select([m1,m2,m3], ['Buy', 'Hold', 'Sell'], default='NA')
insert_logic(df, 'Col1')
insert_logic(df, 'col2')

       Date  Col1  col2 Col1_1 col2_2
0  20000101   0.5  0.00     NA     NA
1  20000102   0.5  0.50   Hold    Buy
2  20000103   0.0  0.25   Sell   Sell
3  20000104   0.5  0.50    Buy    Buy

Примечание : у нас есть NA в первых строках обоих столбцов, поскольку предыдущей строки для сравнения нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...