Pandas groupby добавляет значение одной строки в группе ко всем строкам группы - PullRequest
0 голосов
/ 11 июня 2018

Учитывая DataFrame df, который выглядит примерно так:

    TripID  time  Latitude  SectorID  sector_leave_time
 0      42     7      52.5         5                  8
 1      42     8      52.6         5                  8
 2      42     9      52.7         6                 10
 3      42    10      52.8         6                 10
 4       5     9      50.1         2                 10
 5       5    10      50.0         2                 10
 6       5    11      49.9         1                 12
 7       5    12      49.8         1                 12

Я уже вычислил время, когда поездка покидает сектор, получив максимальную временную метку внутри сектора.Теперь я хотел бы добавить еще один столбец для широты в точке sector_leave_time для каждой поездки и сектора, поэтому DataFrame становится следующим:

    TripID  time  Latitude  SectorID  sector_leave_time  sector_leave_lat
 0      42     7      52.5         5                  8              52.6
 1      42     8      52.6         5                  8              52.6
 2      42     9      52.7         6                 10              52.8
 3      42    10      52.8         6                 10              52.8
 4       5     9      50.1         2                 10              50.0
 5       5    10      50.0         2                 10              50.0
 6       5    11      49.9         1                 12              49.8
 7       5    12      49.8         1                 12              49.8

Пока что мне удалось добавить только sector_leave_lat до строки, где time == sector_leave_time, т.е. когда поездка покидает сектор, используя следующую строку кода:

 df['sector_leave_lat'] = df.groupby('TripID').apply(lambda x : x.loc[x['time'] == x['sector_leave_time'], 'Latitude']).reset_index().set_index('level_1')['Latitude']

Я знаю, что эта строка выглядит ужасно, и я хотел бы добавить sector_leave_lat квсе записи этой поездки в этом секторе.У меня заканчиваются идеи, поэтому я надеюсь, что кто-то сможет помочь.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Проблема не так сложна, если вы знакомы с SQL :) Следующий код должен помочь:

#Given your dataframe :
df

   TripID  time  Latitude  SectorID  sector_leave_time
0    42.0   7.0      52.5       5.0                8.0
1    42.0   8.0      52.6       5.0                8.0
2    42.0   9.0      52.7       6.0               10.0
3    42.0  10.0      52.8       6.0               10.0
4     5.0   9.0      50.1       2.0               10.0
5     5.0  10.0      50.0       2.0               10.0
6     5.0  11.0      49.9       1.0               12.0
7     5.0  12.0      49.8       1.0               12.0

# Get the Latitude corresponding to time = sector_leave_time
df_max_lat = df.loc[df_merged.time==df.sector_leave_time, ['TripID', 'Latitude', 'SectorID']]
# Then you have :

   TripID  Latitude  SectorID
1    42.0      52.6       5.0
3    42.0      52.8       6.0
5     5.0      50.0       2.0
7     5.0      49.8       1.0

# Add the max latitude to original dataframe applying a left join
pd.merge(df, df_max_lat, on=['TripID', 'SectorID'], how='left', suffixes=('','_sector_leave'))
# You're getting :
    TripID  time    Latitude    SectorID    sector_leave_time   Latitude_sector_leave
0   42.0    7.0     52.5    5.0     8.0     52.6
1   42.0    8.0     52.6    5.0     8.0     52.6
2   42.0    9.0     52.7    6.0     10.0    52.8
3   42.0    10.0    52.8    6.0     10.0    52.8
4   5.0     9.0     50.1    2.0     10.0    50.0
5   5.0     10.0    50.0    2.0     10.0    50.0
6   5.0     11.0    49.9    1.0     12.0    49.8
7   5.0     12.0    49.8    1.0     12.0    49.8

Ну вот, пожалуйста:)

0 голосов
/ 11 июня 2018

для каждой комбинации трех секторов, в которой вы хотите указать последнюю широту, отсортированную по времени.

df['sector_leave_lat'] = df.sort_values('time').groupby(
    ['TripID', 'SectorID']
).transform('last')['Latitude']

outputs:
   TripID  time  Latitude  SectorID  sector_leave_time  test
0      42     7      52.5         5                  8  52.6
1      42     8      52.6         5                  8  52.6
2      42     9      52.7         6                 10  52.8
3      42    10      52.8         6                 10  52.8
4       5     9      50.1         2                 10  50.0
5       5    10      50.0         2                 10  50.0
6       5    11      49.9         1                 12  49.8
7       5    12      49.8         1                 12  49.8

Поскольку данные выборки уже отображаются отсортированными по времени в каждой группе трипсектора, сортировка здесь может быть избыточной

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