Как назначить данные после группового и Concat в пандах - PullRequest
0 голосов
/ 28 декабря 2018

Я новичок в питоне.У меня огромный dataframe с миллионами строк и идентификатором.мои данные выглядят так:

Time    ID  X   Y
8:00    A   23  100
9:00    B   24  110
10:00   B   25  120
11:00   C   26  130
12:00   C   27  140
13:00   A   28  150
14:00   A   29  160
15:00   D   30  170
16:00   C   31  180
17:00   B   32  190
18:00   A   33  200
19:00   C   34  210
20:00   A   35  220
21:00   B   36  230
22:00   C   37  240
23:00   B   38  250

Я отсортировал данные по идентификатору и времени.

Time    ID  X   Y
8:00    A   23  100
13:00   A   28  150
14:00   A   29  160
18:00   A   33  200
20:00   A   35  220
9:00    B   24  110
10:00   B   25  120
17:00   B   32  190
21:00   B   36  230
23:00   B   38  250
11:00   C   26  130
12:00   C   27  140
16:00   C   31  180
19:00   C   34  210
22:00   C   37  240
15:00   D   30  170

, и я хочу выбрать только «Первый и последний» из идентификатора иустранить все остальное.Результат выглядел следующим образом:

Time    ID  X   Y
8:00    A   23  100
20:00   A   35  220
9:00    B   24  110
23:00   B   38  250
11:00   C   26  130
22:00   C   37  240
15:00   D   30  170

Я использовал этот код:

df = pd.read_csv("data.csv")
g = df.groupby('ID')
g_1 = pd.concat([g.head(1),g.tail(1)]).drop_duplicates().sort_values('ID').reset_index(drop=True)
g_1.to_csv('result.csv')

, но я хочу назначить или дать аннотацию каждой строке как «первый» и «последний» в новомколонка.
мой ожидаемый результат выглядит так:

Time    ID  X   Y   Annotation
8:00    A   23  100 First
20:00   A   35  220 Last
9:00    B   24  110 First
23:00   B   38  250 Last
11:00   C   26  130 First
22:00   C   37  240 Last
15:00   D   30  170 

кто-нибудь может мне помочь с этим?пожалуйста, дайте мне совет, спасибо.

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Вы можете использовать групповые агг, первый и последний.Отлично работает для колонки Аннотация.В качестве бонуса, это будет работать на исходном кадре данных, поэтому нет необходимости сортировать

df3.groupby('ID').agg(['first', 'last']).stack().reset_index().rename(columns = {'level_1': 'Annotation'})

    ID  Annotation  Time    X   Y
0   A   first   8:00    23  100
1   A   last    20:00   35  220
2   B   first   9:00    24  110
3   B   last    23:00   38  250
4   C   first   11:00   26  130
5   C   last    22:00   37  240
6   D   first   15:00   30  170
7   D   last    15:00   30  170
0 голосов
/ 28 декабря 2018

Попробуйте:

df.groupby('ID').agg(['first','last'])\
  .stack(1).reset_index()\
  .rename(columns={'level_1':'Annotation'})

Вывод:

  ID Annotation   Time   X    Y
0  A      first   8:00  23  100
1  A       last  20:00  35  220
2  B      first   9:00  24  110
3  B       last  23:00  38  250
4  C      first  11:00  26  130
5  C       last  22:00  37  240
6  D      first  15:00  30  170
7  D       last  15:00  30  170
0 голосов
/ 28 декабря 2018

Нет необходимости groupby, используя drop_duplicates после сортировки

df=pd.concat([df.drop_duplicates(['ID']).assign(sign='first'),df.drop_duplicates(['ID'],keep='last').assign(sign='last')]).sort_values('ID')
df
     Time ID   X    Y   sign
0    8:00  A  23  100  first
4   20:00  A  35  220   last
5    9:00  B  24  110  first
9   23:00  B  38  250   last
10  11:00  C  26  130  first
14  22:00  C  37  240   last
15  15:00  D  30  170  first
15  15:00  D  30  170   last
...