给出一个特定的df:
ID Text
1 abc
1 xyz
2 xyz
2 abc
3 xyz
3 abc
3 ijk
4 xyz
我想应用条件where:按ID分组,如果abc存在则删除xyz行。结果将是:
ID Text
1 abc
2 abc
3 abc
3 ijk
4 xyz
通常我会按ID对它们进行分组并应用np.where(...)。但是,我不认为这种方法适用于这种情况,因为它基于行 非常感谢!
答案 0 :(得分:2)
据我所知,您可以使用groupby
+ transform
对其进行矢量化:
df[~(df.Text.eq('abc').groupby(df.ID).transform('any') & df.Text.eq('xyz'))]
ID Text
0 1 abc
3 2 abc
5 3 abc
6 3 ijk
7 4 xyz
答案 1 :(得分:2)
我正在使用crosstab
s=pd.crosstab(df.ID,df.Text)
s.xyz=s.xyz.mask(s.abc.eq(1)&s.xyz.eq(1))
s
Out[162]:
Text abc ijk xyz
ID
1 1 0 NaN
2 1 0 NaN
3 1 1 NaN
4 0 0 1.0
s.replace(0,np.nan).stack().reset_index().drop(0,1)
Out[167]:
ID Text
0 1 abc
1 2 abc
2 3 abc
3 3 ijk
4 4 xyz