相关:Selecting with complex criteria from pandas.DataFrame
我有一些DataFrame:
df = pd.DataFrame({'name': ['apple1', 'apple2', 'apple3', 'apple4', 'orange1', 'orange2', 'orange3', 'orange4'],
'A': [0, 0, 0, 0, 0, 0 ,0, 0],
'B': [0.10, -0.15, 0.25, -0.55, 0.50, -0.51, 0.70, 0],
'C': [0, 0, 0.25, -0.55, 0.50, -0.51, 0.70, 0.90],
'D': [0.10, -0.15, 0.25, 0, 0.50, -0.51, 0.70, 0.90]})
df
name A B C D
0 apple1 0 0.10 0.00 0.10
1 apple2 0 -0.15 0.00 -0.15
2 apple3 0 0.25 0.25 0.25
3 apple4 0 -0.55 -0.55 0.00
4 orange1 0 0.50 0.50 0.50
5 orange2 0 -0.51 -0.51 -0.51
6 orange3 0 0.70 0.70 0.70
7 orange4 0 0.00 0.90 0.90
现在假设我要在A
,B
,C
和D
中选择所有值小于0.25的行:
df[(df['A'] < 0.25) &
(df['B'] < 0.25) &
(df['C'] < 0.25) &
(df['D'] < 0.25)]
name A B C D
0 apple1 0 0.10 0.00 0.10
1 apple2 0 -0.15 0.00 -0.15
3 apple4 0 -0.55 -0.55 0.00
5 orange2 0 -0.51 -0.51 -0.51
太好了,但是我可以使用列列表作为输入来实现相同的目的吗?
想象一下,我想过滤100列而不是4列。
答案 0 :(得分:3)
在这种情况下,由于您对多个列具有相同的条件,因此可以对axis=1
使用.all
来检查 all True >所选列:
df[df.loc[:, 'A':].lt(0.25).all(axis=1)]
name A B C D
0 apple1 0 0.10 0.00 0.10
1 apple2 0 -0.15 0.00 -0.15
3 apple4 0 -0.55 -0.55 0.00
5 orange2 0 -0.51 -0.51 -0.51
如果您的列排序不正确,请使用双括号选择数据:
df[df[['A', 'B', 'C', 'D']].lt(0.25).all(axis=1)]
注意: .lt
与<
相同,代表“ l ess t han “
如果,如果您有很多带有单个字母的列,那么您将无法手动选择太多列,我们可以将DataFrame.filter
与regex
结合使用:
df[df.filter(regex='[A-Z]').lt(0.25).all(axis=1)]
答案 1 :(得分:2)
将DataFrame.all
与"{0} - {1} > interval '1 day'"
结合使用以执行boolean indexing
。
axis=1
输出
df[(df[['A','B','C','D']]<0.25).all(axis=1)]
另一种方法:pd.Index.difference
name A B C D
0 apple1 0 0.10 0.00 0.10
1 apple2 0 -0.15 0.00 -0.15
3 apple4 0 -0.55 -0.55 0.00
5 orange2 0 -0.51 -0.51 -0.51