Как суммировать сводные данные с РАЗНИЦЕЙ во времени по одному из индексов

#python #pandas

#python #pandas

Вопрос:

Извините, заголовок сообщения неясен, и, вероятно, поэтому я изо всех сил пытаюсь найти это в Python / Pandas. Мне интересно, нужно ли мне группировать, а затем разделять данные….

Я пытаюсь найти общее время, в течение которого человек использует веб-сайт, находя различия между временем доступа к странице в журнале активности. Я использую SHIFT в python, чтобы получить предыдущую (или следующую) запись в качестве нового столбца во фрейме данных. Затем я сравниваю разницу во времени таким образом. Все это работает, и я спрашивал об этом раньше.

Проблема, которую я не могу решить, заключается в том, как «РАЗЛИЧАТЬ» время в журнале активности только там, где время для одного и того же пользователя или сеанса. В настоящее время я различаю все записи во фрейме данных, но это явно неправильно, когда изменяется идентификатор пользователя или сеанса. В некоторых местах я получаю очень высокие значения.

Вот мой пример в коде python.

Как мне выполнить различие только для тех же записей «B» и начать все сначала для нового значения «B».

Спасибо, Джейсон

 # python diff summing

import urllib
import numpy as np
import pandas as pd
import time
import datetime
import math

# Using lamba as in reality I'm diffing 2 dates and returning 
# difference in seconds. and checking for zero or NAN
def my_diff(a, b):
    c = abs(b-a)
    if c <1:
        c=1
    if math.isnan(c):
        c=1
    return c

# Required -sum the total time in seconds 
# where a user (A) spends time in one session (B)
# I want the total time for all sessions per user but
# having trouble DIFFing between values *only*
# in the same session
# In real data the data is also sorted by
# user, session, datetime so no need to sort.

# A is userid
# B is session ID so will be an integer and unique
# C is access timestamp but just a random number here.
# D is irrelevant here

df = pd.DataFrame({'A' : ['user1', 'user1', 'user1', 'user1',
                          'user2', 'user2', 'user2', 'user2'],
                    'B' : ['abc123', 'random', 'jeff', 'gjgjg',
                           'four', 'five', 'six', 'seven'],
                      'C' : np.random.randn(8),
                      'D' : np.random.randn(8)})
# This I think is wrong as I'm DIFFing next/previous record even
# though B the session ID might change
# I only want to DIFF where the session IDs are the same
# i.e. same user and same session.
df['PREVIOUS_C'] = df.C.shift(-1)
df['DIFF'] = df.apply(lambda row: my_diff(row.C, row.PREVIOUS_C), axis=1)
print df

# This is almost what I'm after but I want DIFF to only be difference 
# where the session IDs (and user) are the same.
# Diffing over a change of A or B does not make sense here.
pivot = df.pivot_table(index=['A','B'], values=["DIFF"],aggfunc={np.sum},fill_value=0)

print pivot # Desired output to be saved to CSV

# pivot again to get total for each user
  

Ответ №1:

В приведенном вами примере нет общих идентификаторов сеанса, поэтому ваш столбец различий будет иметь только нулевые значения, но вам нужно следующее:

 df['diff'] = df.groupby(['A','B'])['C'].transform(lambda x:x - x.shift(-1))
  

Если вы хотите увидеть разницу в C только по имени пользователя, а не по имени пользователя идентификатору сеанса, вы бы сделали что-то подобное:

 df['diff'] = df.groupby(['A'])['C'].transform(lambda x:x - x.shift(-1))
  

Комментарии:

1. Спасибо, это было быстро. Да, мои поддельные данные выглядели нормально, потому что я ошибся. Я должен был проверить это с помощью Excel или чего-то еще, но спасибо, что исправили это. Я попробую. Jas

2. Это тоже работает. Я предоставил несколько лучших поддельных данных, если кто-нибудь пытается это сделать: #Better faked data df = pd.DataFrame({‘A’: [‘user1’, ‘user1’, ‘user1’, ‘user1’, ‘user2’, ‘user2’, ‘user2’, ‘user2’, ‘user2’, ‘user2’, ‘user2’] *4, ‘B’: [‘abc123’, ‘random’, ‘jeff’, ‘gjgjg’, ‘four’, ‘five’, ‘six’, ‘seven’] *4, ‘C’: np.random.randn(32), ‘D’: np.random.randn(32)}) df = df.sort_values([‘A’,’B’]) # Сортировка поддельных данных так, чтобы они были похожи на реальные данные