2016-12-30 2 views
-2

Итак, я пытался выполнить это в SQL, но мне было сказано, что в Pandas будет простой способ сделать это. Я был бы признателен за вашу помощь/подсказки!Pandas: добавить значения в два новых столбца в таблице, если значения в двух предыдущих столбцах непрерывны?

В настоящее время у меня есть таблица слева с двумя столбцами (начало подсчета и конечная подсекция), и я хотел бы добавить два левых столбца «начало сеанса» и «конец сеанса». Я знаю, как просто добавлять столбцы, но я не могу понять запрос, который позволил бы мне идентифицировать непрерывные значения в двух исходных столбцах (т. Е. Конечное значение подсеанса такое же, как в следующих строках, значение сеанса), а затем добавить первое начальное значение сеанса и значение последнего конца сеанса (для непрерывных строк) в соответствующие строки в моих новых столбцах. Пожалуйста, обратитесь к изображению .. например, для первых трех строк значение «конечная подсечка» совпадает с значениями «начать подсчет» следующих строк, поэтому первые три «начала сеанса» и «конец сеанса» будут то же самое, с минимальными значениями «начала подсчета» и максимальным значением «конечная подсекция».

я что-то вдоль этих линий в SQL пытаясь, очевидно, не работает, и я понял, что агрегатная функция не работает в этом случае ...

SELECT 
FROM viewershipContinuous = 
    CASE 
     WHEN endSubsession.ROWID = beginSubession.ROWID+1 
     THEN MIN(beginSubsession) 
     ELSE beginSubsession.ROWID+1 
     END; 

В таблице слева, что у меня есть таблица по праву является то, что я хочу достичь

enter image description here

+0

Я запутался ... –

+0

К сожалению, спасибо для ловли, что я прикрепил другое изображение, чем я думал. – user7351553

ответ

1

Вы можете сравнить первые следующее значение по колонку esubshift ред с колонкой bsub если не равен (!=), а затем создать группы по cumsum:

s = df['bsub'].ne(df['esub'].shift()).cumsum() 
print (s) 
0 1 
1 1 
2 1 
3 2 
4 2 
5 2 
6 2 
7 3 
8 3 
dtype: int32 

Тогда groupby по Seriess с transformmin и max:

g = df.groupby(s) 
df['session start'] = g['bsub'].transform('min') 
df['session end'] = g['esub'].transform('max') 
print (df) 
    bsub esub session start session end 
0 1700 1705   1700   1800 
1 1705 1730   1700   1800 
2 1730 1800   1700   1800 
3 1900 1920   1900   1965 
4 1920 1950   1900   1965 
5 1950 1960   1900   1965 
6 1960 1965   1900   1965 
7 2000 2001   2000   2002 
8 2001 2002   2000   2002 
+0

Да, спасибо! – user7351553

Смежные вопросы