Панды: получить совокупную сумму столбца, только если отметка времени больше, чем у другого столбца - PullRequest
2 голосов
/ 29 сентября 2019

Для каждого клиента я хотел бы получить совокупную сумму столбца (долларовое значение) только в том случае, если отметка времени 1 меньше отметки времени 2. Я мог бы сделать декартово объединение значений на основе данных клиента или выполнить итерацию по фрейму данных,но хотел посмотреть, есть ли более простой способ сделать это, возможно, с групповым и подать заявку.

DataFrame:

df = pd.DataFrame({'Customer': ['Alice','Brian','Alice','Alice','Alice','Brian', 'Brian'], 'Timestamp': [1,2,3,4,5,3,6], 'Timestamp 2': [2,5,4,6,7,5,7], 'Dollar Value':[0,1,3,5,3,2,3]})

Значения сортировки:

df = df.sort_values(['Customer','Timestamp'])

Ожидаемые результаты:

df['Desired_result'] = [0,0,0,3,0,0,3]

DataFrame

Ответы [ 2 ]

1 голос
/ 29 сентября 2019

Это может сработать

получить строки, в которых выполняется условие, а затем выполнить cumsum

cond = df["Timestamp"]>df["Timestamp 2"]
df["Dollar Value"].where(cond, 0).groupby([cond, df["Customer"]]).cumsum()

Редактировать на основе вашего комментария, возможно, это то, что вам нужно

df = pd.DataFrame({'Customer': ['Alice','Brian','Alice','Alice','Alice','Brian', 'Brian'], 'Timestamp': [1,2,3,4,5,3,6], 'Timestamp 2': [2,5,4,6,7,5,7], 'Dollar Value':[0,1,3,5,3,2,3]})

def sum_dollar_value(group):
    group = group.copy()
    last_row = group.iloc[-1, :]
    cond = group["Timestamp 2"]<last_row["Timestamp"]
    group.loc[last_row.name, "result"] = np.sum(group["Dollar Value"].where(cond, 0))
    return group

df.groupby("Customer").apply(sum_dollar_value).reset_index(level=0, drop=True)
0 голосов
/ 29 сентября 2019

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

# set condition
cond = df["Timestamp"]<df["Timestamp 2"]
df[cond].groupby('Customer')['Dollar Value'].sum()

Примечание. Синтаксис условия из предыдущего ответа заимствован на Дев Хадка

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