Сгруппируйте повторяющиеся строки и найдите разницу во времени из одного столбца даты и времени в Pandas. - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть фрейм данных со столбцом времени, а затем столбец значений с повторяющимися значениями A / B.Мне нужно иметь возможность сгруппировать эти значения в пары и найти временную дельту между ними.

import pandas as pd
df = pd.DataFrame()
df['time1'] = pd.date_range('2018-01-01', periods=6, freq='H') 
df['id'] = range(1,7)
df['val'] = ['A','B'] * 3

                 time  id val
0 2018-01-01 00:00:00   1   A
1 2018-01-01 01:00:00   2   B
2 2018-01-01 02:00:00   3   A
3 2018-01-01 03:00:00   4   B
4 2018-01-01 04:00:00   5   A
5 2018-01-01 05:00:00   6   B

должно быть ...

index        diff     A   B
  0      01:00:00     1   2
  1      01:00:00     3   4
  2      01:00:00     5   6

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Создайте pair_id, он будет использоваться для идентификации пар.Добавьте это к df

pair_id = sorted(list(range(0, int(df.shape[0]/2))) * 2)
df.loc[:, 'pair'] = pair_id

Определите функцию разности

def diff(x):
    return max(x) - min(x)

Используя groupby сделайте вычисление разницы

diff_df = df.groupby('pair')['time1'].apply(diff).to_frame('diff')

И сгруппируйтеоставшиеся данные

id_df = df.groupby(['pair','val'])['id'].sum().unstack()

Итак, у нас есть diff_df:

         diff
pair         
0    01:00:00
1    01:00:00
2    01:00:00

И id_df:

val   A  B
pair      
0     1  2
1     3  4
2     5  6

Соедините эти два

diff_df.join(id_df)
         diff  A  B
pair               
0    01:00:00  1  2
1    01:00:00  3  4
2    01:00:00  5  6
0 голосов
/ 15 февраля 2019

Вероятно, есть гораздо более простой / быстрый способ сделать это в Pandas, но, учитывая ваши примерные данные, вот то, что я придумал, что, кажется, работает.Он использует рецепт grouper() из документов itertools, чтобы вытащить строки 2 за раз из кадра данных, а затем берет временную дельту и сливается в одну новую строку.

from itertools import zip_longest

def grouper(iterable, n, fillvalue=None):
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

new_rows = []
for a, b in grouper(df.iterrows(), 2):
    tdelta = b[1][0] - a[1][0]
    aid = a[1][1]
    bid = b[1][1]
    new_rows.append({'diff': tdelta, 'A': aid, 'B': bid})
new_df = pd.DataFrame(new_rows)
new_df = new_df.reindex(columns=['diff', 'A', 'B'])

Что дает:

>>> print(new_df)
      diff  A  B
0 01:00:00  1  2
1 01:00:00  3  4
2 01:00:00  5  6

... Но приведенное выше решение Диллона гораздо чище и, вероятно, гораздо эффективнее:)

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