Pandas按字符串过滤

时间:2017-06-06 22:47:04

标签: python pandas numpy

我需要过滤我的群组,以便只显示群组所有行中包含字符串的群组。

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   

当我更改应用于过滤器时,我收到错误。

请帮助!

3 个答案:

答案 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
相关问题