我有一个熊猫表,其中包含一些列:
col_list = list('ABC')
df = pd.DataFrame(np.random.randint(10, size=(5,3)), columns=col_list)
A B C
0 8 5 7
1 5 4 1
2 7 5 6
3 6 6 0
4 3 4 1
,并且我有一个要根据其过滤df的阈值列表:
thr = [3, 6, 9]
是否有一种方法可以根据df
中的相关阈值过滤每一列中的thr
,因此
new_df = df[(df['A']>thr[0]) & (df['B']>thr[1]) & (df['C']>thr[2]) )
无需使用运算符的列表理解来明确地编写它,例如
not_sure = [df.iloc[:, [i]]>thr[i] for i in range(3)]
?
答案 0 :(得分:3)
将boolean indexing
与np.all
创建的布尔掩码一起使用:
print (df)
A B C
0 5 8 10
1 5 4 1
2 7 5 6
3 6 6 0
4 3 4 1
thr = [3, 6, 9]
df = df[np.all(df.values > np.array(thr), axis=1)]
print (df)
A B C
0 5 8 10
使用DataFrame.gt
和(>)
和DataFrame.all
的熊猫解决方案:
df = df[df.gt(thr).all(axis=1)]
print (df)
A B C
0 5 8 10
以及列表理解的解决方案:
masks = [df.iloc[:, i] > j for i, j in enumerate(thr)]
df = df[pd.concat(masks, axis=1).all(axis=1)]
替代:
df = df[np.logical_and.reduce(masks)]
说明:
首先用np.array
比较所有值-thr
和列的长度必须相同:
print (df.values > np.array(thr))
[[ True True True]
[ True False False]
[ True False False]
[ True False False]
[False False False]]
然后按numpy.all
来检查每行所有True
:
print (np.all(df.values > np.array(thr), axis=1))
[ True False False False False]