Панды выбирают последовательные изменения без итерации - PullRequest
0 голосов
/ 31 мая 2018

У меня есть кадр данных, который выглядит следующим образом:

In [9]: d = pd.DataFrame({'place': ['home', 'home', 'home', 'home', 'office', 'office', 'office', 'home', 'office', 'home', 'office', 'home', 'office', 'home'], 'person': ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'c', 'c'], 'other_stuff': ['f', 'g', 'd', 'q', 'w', 'r', 's', 't', 'u', 'v', 'w', 'l', 'm', 'n']})



In [7]: d
      place  other_stuff person
 0     home           f      a
 1     home           g      a
 2     home           d      a
 3     home           q      a
 4   office           w      a
 5   office           r      a
 6   office           s      a
 7     home           t      b
 8   office           u      b
 9     home           v      c
 10  office           w      c
 11    home           l      c
 12  office           m      c
 13    home           n      c

В моих данных есть только две категории place: home и office.Я хочу выбрать строки этого кадра данных, которые соответствуют всем person, которые имеют «постоянные переходы» в столбце place.то есть, я хочу выбрать только persons, у которых есть изменения в place, и они не меняются обратно.

В этом примере кадра данных я хочу выбрать все строки, соответствующие person a и person b, но не person c.Желаемый результат:

      place  other_stuff person
 0     home           f      a
 1     home           g      a
 2     home           d      a
 3     home           q      a
 4   office           w      a
 5   office           r      a
 6   office           s      a
 7     home           t      b
 8   office           u      b

Я планирую groupby в столбце person, а затем написать функцию для apply для каждой группы наблюдений.Мой фрейм данных содержит около 60 миллионов строк и 700 000 уникальных persons, поэтому я не хочу использовать какую-либо итерацию.Я не уверен, как написать функцию, которая будет выбирать правильные строки, не просматривая каждую группу person наблюдений.

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

В каждой группе подсчитайте, сколько раз человек переехал.Если один или меньше, верните true, иначе false и не получите эти записи.

Использование:

d[d.groupby('person')['place'].transform(lambda x: (x != x.shift(-1).ffill()).sum())<=1]

Вывод:

    place person other_stuff
0    home      a           f
1    home      a           g
2    home      a           d
3    home      a           q
4  office      a           w
5  office      a           r
6  office      a           s
7    home      b           t
8  office      b           u
0 голосов
/ 31 мая 2018

Вам необходимо получить список людей, чье текущее место отличается от начала.

g = d.groupby('person')
c = pd.DataFrame(g.first()!=g.last())
list_person = c.loc[c['place']==True].index
d.loc[d['person'].isin(list_person)]

Вывод:

   place    other_stuff person
0   home    f             a
1   home    g             a
2   home    d             a
3   home    q             a
4   office  w             a
5   office  r             a
6   office  s             a
7   home    t             b
8   office  u             b
0 голосов
/ 31 мая 2018

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

s=df.groupby('person').apply(lambda   x : (x['place'].shift()!=x['place']).cumsum().nunique())

df.loc[df.person.isin(s[s<=2].index)]



    place other_stuff person
0    home           f      a
1    home           g      a
2    home           d      a
3    home           q      a
4  office           w      a
5  office           r      a
6  office           s      a
7    home           t      b
8  office           u      b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...