Группировать по утверждению if - PullRequest
0 голосов
/ 03 января 2019

У меня есть df, который содержит идентификаторы и метки времени.

Я искал группировки по идентификатору и затем условию на отметке времени в двух строках.Что-то вроде if timestamp_col1> timestamp_col1 для второй строки, затем 1 else 2

В основном группировка идентификаторов и оператор if дают значение 1, если временная метка первой строки <второйи 2, если отметка времени второй строки <, то первая </p>

df sample below

Обновленный вывод ниже, где последние два значения должны быть 2 Updated Output

1 Ответ

0 голосов
/ 03 января 2019

Используйте to_timedelta для преобразования time с, затем агрегируйте разницу между первым и последним значением и сравните по gt (>), последнему map с numpy.where для назначения нового столбца:

df = pd.DataFrame({
    'ID Code': ['a','a','b','b'],
    'Time Created': ['21:25:27','21:12:09','21:12:00','21:12:40']
})

df['Time Created'] = pd.to_timedelta(df['Time Created'])

mask = df.groupby('ID Code')['Time Created'].agg(lambda x: x.iat[0] < x.iat[-1])
print (mask)
ID Code
a     True
b    False
Name: Time Created, dtype: bool

df['new'] = np.where(df['ID Code'].map(mask), 1, 2)
print (df)
  ID Code Time Created  new
0       a     21:25:27    2
1       a     21:12:09    2
2       b     21:12:00    1
3       b     21:12:40    1

Другое решение с transform для возврата совокупного значения в новый столбец, здесь логическая маска:

df['Time Created'] = pd.to_timedelta(df['Time Created'])

mask = (df.groupby('ID Code')['Time Created'].transform(lambda x: x.iat[0] > x.iat[-1]))
print (mask)
0     True
1     True
2    False
3    False
Name: Time Created, dtype: bool

df['new'] = np.where(mask, 2, 1)
print (df)
  ID Code Time Created  new
0       a     21:25:27    2
1       a     21:12:09    2
2       b     21:12:00    1
3       b     21:12:40    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...