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我的数据中只有两个类别:home和office.我想选择此数据框的行,这些行对应person于place列中具有"永久转换"的所有人.也就是说,我只想选择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观察.
使用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)
| 归档时间: |
|
| 查看次数: |
51 次 |
| 最近记录: |