我需要过滤我的群组,以便只显示群组所有行中包含字符串的群组。
Index A B C
0 A1 B5 T
1 A1 B2 T
2 A1 B2 F
3 A2 B5 T
4 A2 F5 T
5 A3 F4 T
6 A4 F4 F
返回:
Index A B C
3 A2 B5 T
4 A2 F5 T
5 A3 F4 T
尝试:df.groupby('A').apply(lambda x: x[x['C']==T])
正如您所知,它会返回:
Index A B C
0 A1 B5 T
1 A1 B2 T
3 A2 B5 T
4 A2 F5 T
5 A3 F4 T
当我更改应用于过滤器时,我收到错误。
请帮助!
答案 0 :(得分:2)
使用transform
最快的解决方案
df[df.C.eq('T').groupby(df.A.values).transform('all')]
A B C
Index
3 A2 B5 T
4 A2 F5 T
5 A3 F4 T
使用crosstab
我能想到的最短的解决方案......但速度慢
df[df.A.map(pd.crosstab(df.A, df.C).F.eq(0))]
A B C
Index
3 A2 B5 T
4 A2 F5 T
5 A3 F4 T
<强> project
/ 杀 强>
非常快速的解决方案......但很复杂
f, u = pd.factorize(df.A.values)
t = (df.C.values == 'T').astype(int)
b0 = np.bincount(f * 2 + t)
pad = np.zeros(2 * u.size - b0.size, dtype=int)
b = np.append(b0, pad)
df[~b.reshape(-1, 2)[:, 0].astype(bool)[f]]
A B C
Index
3 A2 B5 T
4 A2 F5 T
5 A3 F4 T
计时
%timeit df[df.C.eq('T').groupby(df.A.values).transform('all')]
%timeit df[df.A.map(pd.crosstab(df.A, df.C).F.eq(0))]
%timeit df.groupby('A').filter(lambda x: len(x[x.C=='T'])==len(x))
1000 loops, best of 3: 1.67 ms per loop
100 loops, best of 3: 6.15 ms per loop
100 loops, best of 3: 3.05 ms per loop
%%timeit
f, u = pd.factorize(df.A.values)
t = (df.C.values == 'T').astype(int)
b0 = np.bincount(f * 2 + t)
pad = np.zeros(2 * u.size - b0.size, dtype=int)
b = np.append(b0, pad)
df[~b.reshape(-1, 2)[:, 0].astype(bool)[f]]
1000 loops, best of 3: 279 µs per loop
d1 = df.assign(mydummy=df['C']=='T')
d1['mysum'] = d1.groupby('A').mydummy.transform('sum')
d1['mycount'] = d1.groupby('A').mysum.transform('size')
d1.loc[d1.mysum == d1.mycount, df.columns]
100 loops, best of 3: 3.68 ms per loop
答案 1 :(得分:1)
试试这个小家伙
df['mydummy'] = x['C']== T
df['mysum'] = df.groupby('A').mydummy.transform('sum')
df['mycount'] = df.groupby('A').mysum.transform('size')
df = df.loc[mysum == mycount]
答案 2 :(得分:1)
您可以在groupby之后使用过滤器来检查组中的所有行是否在C列中都有T.
df.groupby('A').filter(lambda x: len(x[x.C=='T'])==len(x))
Out[41]:
Index A B C
3 3 A2 B5 T
4 4 A2 F5 T
5 5 A3 F4 T