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

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

Я пробовал этот код, но он создал новую строку и не меняет существующую строку.

def updateRecord(dfIn, starDate, endDate):
    mask = (dfIn['date'] <= endDate) & (dfIn['date'] >= startDate)
    new_df = dfIn.loc[mask]
    if len(new_df) == 0:
        return dfIn

    dfIn.loc[dfIn.loc[mask].price.max(), 'highest'] = 1
    dfIn.loc[dfIn.loc[mask].price.min(), 'lowest'] = 1
    return dfIn
date       price  highest  lowest
2000-05-01 04:00:00    4.439730             0            0
2000-05-02 04:00:00    4.209830             0            0
2000-05-03 04:00:00    4.109380             0            0
2000-05-04 04:00:00    3.953130             0            0
2000-05-05 04:00:00    4.040180             0            0
2000-05-08 04:00:00    3.933040             0            0
2000-05-09 04:00:00    3.765630             0            0
2000-05-10 04:00:00    3.546880             0            0
2000-05-11 04:00:00    3.671880             0            0
2000-05-12 04:00:00    3.843750             0            0
2000-05-15 04:00:00    3.607150             0            0
2000-05-16 04:00:00    3.774560             0            0
2000-05-17 04:00:00    3.620540             0            0
2000-05-18 04:00:00    3.598220             0            0
2000-05-19 04:00:00    3.357150             0            0
2000-05-22 04:00:00    3.212060             0            0
2000-05-23 04:00:00    3.064740             0            0
2000-05-24 04:00:00    3.131700             0            0
2000-05-25 04:00:00    3.116630             0            0
2000-05-26 04:00:00    3.084830             0            0
2000-05-30 04:00:00    3.127230             0            0
2000-05-31 04:00:00    3.000000             0            0
2000-06-01 04:00:00    3.183040             0            0
2000-06-02 04:00:00    3.305810             0            0
.....
2000-06-30 04:00:00    3.261160             0            0

желаемый результат должен состоять в том, что строки должны быть обновлены, как показано ниже:

df = updateRecord(df, '2000-05-01 04:00:00', '2000-05-31 04:00:00')

df output should be:

2000-05-01 04:00:00    4.439730             1            0
2000-05-31 04:00:00    3.000000             0            1

мой текущий код создает новую строку вместо обновления существующей строки.

Ответы [ 3 ]

1 голос
/ 14 мая 2019

Я уверен, что это не лучший способ.

def updateRecord(dfIn, starDate, endDate):
    df_o = dfIn.loc[(dfIn['date'] <= endDate) & (dfIn['date'] >= startDate)]
    if len(df_o) == 0:
        return dfIn
    # What is supposed to happen if len(df_o) > 0?
    idx = df_o['price'].argmax()
    df_o.at[idx,'highest'] = 1

    idx_l = df_o['price'].argmin()
    df_o.at[idx_l,'lowest'] = 1

    return df_o

Надеюсь, что это работает.

0 голосов
/ 14 мая 2019

Я думаю, вы ищете это.

def updateRecord(dfIn, starDate, endDate):
    mask = (dfIn['date'] <= endDate) & (dfIn['date'] >= startDate)
    if sum(mask) == 0:
        return dfIn

    # You want the argmax[min] for the given mask, not the entire DF, as you stated.
    dfIn.loc[dfIn.loc[mask, 'price'].argmax(), 'highest'] = 1
    dfIn.loc[dfIn.loc[mask, 'price'].argmin(), 'lowest'] = 1

    return dfIn
0 голосов
/ 14 мая 2019

Это работает, но приносит выбранный DataFrame. Если вам нужно то же самое, но с полным кадром DataFrame, я тоже могу это сделать.

def updateRecord(dfIn, startDate, endDate):
    mask = (dfIn['date'] <= endDate) & (dfIn['date'] >= startDate)
    new_df = dfIn.loc[mask]
    if len(new_df) == 0:
        return dfIn
    new_df['highest']=np.where(new_df.price==new_df.price.max(),1,0)
    new_df['lowest']=np.where(new_df.price==new_df.price.min(),1,0)
    return new_df
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...