Панды: группировать и выбирать равномерно расположенные ряды - PullRequest
0 голосов
/ 01 октября 2019

Ниже мои данные отсортированы по метке времени с идентификатором видео (столбец метки времени был удален для простоты)

    cameraId      video
0  5B740319D  1508152851.mp4
1  5B740319D  1508152851.mp4
2  5B740319D  1508244253.mp4
3  5B740319D  1532963014.mp4
4  8B1602B07  1502607932.mp4

Каждый идентификатор камеры имеет 4-100 видео. Мне нужно выбрать 4 видео для каждой камеры. Ex. если у CameraId есть 100 видео, я должен выбрать видео [0, 33, 66, 99]

Это мой подход, выберите первое и последнее видео, а затем случайную выборку середины 2.

first_video = df.drop_duplicates(['cameraId'], keep='first')
last_video = df.drop_duplicates(['cameraId'], keep='last')
middle_videos = df.groupby(['cameraId']).apply(lambda x: x.sample(2, random_state=seed)).reset_index(drop=True)
df = pd.concat([first_video, middle_videos, last_video])

middle_videos обычно не распределяется равномерно, и вот где я застрял.

Вывод должен составлять 4 строки для каждой камерыId

1 Ответ

1 голос
/ 01 октября 2019

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

In [44]: df = pd.DataFrame({
    ...:     'id': [1] * 10 + [2] * 10 + [3] * 20,
    ...:     'file': ['f{}'.format(i) for i in range(10)] +
    ...:             ['f{}'.format(i) for i in range(10,20)] +
    ...:             ['f{}'.format(i) for i in range(20,40)]
    ...: })

In [45]: def pct33(s):
    ...:     return s.iloc[int(len(s) * .33)]
    ...:

In [46]: def pct66(s):
    ...:     return s.iloc[int(len(s) * .66)]
    ...:

In [47]: df.groupby('id').agg({'file': ['first', pct33, pct66, 'last']}).unstack()
Out[47]:
             id
file  first  1      f0
             2     f10
             3     f20
      pct33  1      f3
             2     f13
             3     f26
      pct66  1      f6
             2     f16
             3     f33
      last   1      f9
             2     f19
             3     f39
dtype: object

Вы также можете сбросить дополнительные уровни индексаили прибегните к ним позже, если хотите.

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