Pandas选择一致的更改而不进行迭代

sve*_*esh 1 python select pandas pandas-groupby

我有一个如下所示的数据框:

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
Run Code Online (Sandbox Code Playgroud)

place我的数据中只有两个类别:homeoffice.我想选择此数据框的行,这些行对应personplace列中具有"永久转换"的所有人.也就是说,我只想选择persons那些有变化的人place,不要改变.

在这个示例数据框中,我想选择与persona和personb 相对应的所有行,而不是人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
Run Code Online (Sandbox Code Playgroud)

我计划groupby在列上person,然后apply为每组观察写一个函数.我的数据帧有大约6000万行和700,000个唯一的persons,所以我不想使用任何类型的迭代.我不知道如何编写一个函数来选择正确的行而不迭代每组person观察.

WeN*_*Ben 5

使用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
Run Code Online (Sandbox Code Playgroud)