这是我的数据帧:
d = {'id':['a','a','a','b','b','b','c','c','c','d','d','d'],
'seg':[1,2,3,1,2,3,1,2,3,1,2,3],
'type':['y','y','y','z','z','z','y1','y1','z','z','z','y2']
}
df = pd.DataFrame(d)
我正在尝试根据以下条件过滤id:
- 只有
z
- 只有
y
y
和z
对于第一个和第二个条件,我可以执行以下操作:
df_y = df.loc[df['type'].str.contains('y')]
df_z = df.loc[df['type'] == 'z']
然后,我可以unique
id 列。
如何检查同一 id 的y
和z
type
列中是否存在?
输出:
df_y
id
a
c
d
df_z
id
b
所需输出:
df_y
id
a
df_z
id
b
df_y_z
id
c
d
我们可以做crosstab
+dot
s=pd.crosstab(df.id,df.type).ne(0)
s.dot(s.columns)
Out[277]:
id
a y
b z
c yz
d yz
dtype: object
更新:
df[df.groupby('id')['type']
.transform(lambda x: x[x.str.contains('y|z')].nunique()) == 2]
输出:
id seg type
6 c 1 y1
7 c 2 y1
8 c 3 z
9 d 1 z
10 d 2 z
11 d 3 y2
注意:如果您只想要以 y 或 z 开头的类型,则可以使用包含或 startwith。
IIUC,要获得df_y_z,首先将数据帧筛选为仅包含 y 或 z 的行(如果有更多类型(,然后按 ID 分组,并计算唯一类型的数量(如果等于 2,则具有同时包含 y 和 z 的组:
df.loc[df.query('type in ["y","z"]').groupby('id')['type'].transform('nunique') == 2]
输出:
id seg type
6 c 1 y
7 c 2 y
8 c 3 z
9 d 1 z
10 d 2 z
11 d 3 y