对于多行中的 id,查找熊猫中是否存在值



这是我的数据帧:

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:

  1. 只有z
  2. 只有y
  3. yz

对于第一个和第二个条件,我可以执行以下操作:

df_y = df.loc[df['type'].str.contains('y')]
df_z = df.loc[df['type'] == 'z']

然后,我可以uniqueid 列。

如何检查同一 id 的yztype列中是否存在?

输出:

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

最新更新