从列表中用操作员链过滤熊猫

时间:2018-11-25 15:31:50

标签: python pandas list-comprehension

我有一个熊猫表,其中包含一些列:

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)]

1 个答案:

答案 0 :(得分:3)

boolean indexingnp.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]