【发布时间】:2019-04-05 16:51:10
【问题描述】:
拥有如下所示的数据框:
import pandas as pd
import numpy as np
df = pd.DataFrame(
{'Beverage': ['Beer', 'Wine', 'Whisky'],
'G1_1': [11, 5.1, 2.8],
'G1_2': [6, 4, 0],
'G1_3': [0, 2, 0],
'G2_1': [0, 4.1, 0.8],
'G2_2': [0, 6, 0.1],
'G2_3': [0, 9.4, 0],
}
)
group1 = ['G1_1', 'G1_2', 'G1_3']
df
Beverage G1_1 G1_2 G1_3 G2_1 G2_2 G2_3
0 Beer 11.0 6 0 0 0 0
1 Wine 5.1 4 2 4.1 6.0 9.4
2 Whisky 2.8 0 0 0.8 0.1 0.0
如果我们要选择group1 样本至少有2 个非零值的所有行,一种可能的解决方案是将零值转换为NaN,然后使用pandas DF.dropna 进行过滤。例如:
df.replace({0: np.nan}).dropna(axis=0, thresh=2, subset=group1)
df
Beverage G1_1 G1_2 G1_3 G2_1 G2_2 G2_3
0 Beer 11.0 6 NaN NaN NaN NaN
1 Wine 5.1 4 2 4.1 6.0 9.4
上面删除了Whisky 行,因为group1 中具有非零值的样本少于两个。
如何应用类似的过滤器,但不是过滤零,而是应用一些特定条件,例如,group1 中的至少 2 个样本具有值 >5? (在这种情况下,应该只打印Beer 行)
编辑:
另外,有没有更有效的方法来完成同样的事情?我问这个是因为我必须将过滤器应用于一个非常大的数据框。
【问题讨论】: