这应该可以正常工作:
In [31]:
df[(df.apply(lambda x: x.str[0].astype(int))).lt(5).any(axis=1)]
Out[31]:
a b c d
0 145 567 999 876
基本上,这个方法使用向量化的
str
方法获取每列的第一个字符,将其转换为int,然后调用
lt
方法在行级别上生成布尔值df,然后在df的行上调用
any
方法以生成布尔掩码,并对索引应用该掩码以屏蔽df。因此,可以将上述过程分解为以下步骤:
In [34]:
df.apply(lambda x: x.str[0].astype(int))
Out[34]:
a b c d
0 1 5 9 8
1 9 8 5 5
In [35]:
df.apply(lambda x: x.str[0].astype(int)).lt(5)
Out[35]:
a b c d
0 True False False False
1 False False False False
In [37]:
df.apply(lambda x: x.str[0].astype(int)).lt(5).any(axis=1)
Out[37]:
0 True
1 False
dtype: bool
编辑
为了处理NaN
值,您需要调用dropna
函数:
In [39]:
t="""a,b,c,d
0,145,567,999,876
1,999,876,543,543
2,,324,344"""
df = pd.read_csv(io.StringIO(t),dtype=str)
df
Out[39]:
a b c d
0 145 567 999 876
1 999 876 543 543
2 NaN 324 344 NaN
In [44]:
df[(df.apply(lambda x: x.dropna().str[0].astype(int))).lt(5,axis=0).any(axis=1)]
Out[44]:
a b c d
0 145 567 999 876
2 NaN 324 344 NaN