#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’]) # Сортировка поддельных данных так, чтобы они были похожи на реальные данные