Pandas数据帧子选择

时间:2016-05-30 21:26:32

标签: python pandas dataframe subset

我是编程新手,并且已经开始学习python,试图让我在研究中运行的一些任务更有效率。我正在pandas模块中运行PCA(我在网上找到了一个教程)并且有了这个脚本,但是需要在pca之前选择部分数据帧。

到目前为止我(例如实际上我正在阅读带有更大矩阵的.csv文件)

x = np.random.randint(30, size=(8,8))
df = pd.DataFrame(x)

    0   1   2   3   4   5   6   7
0   9   0  23  13   2   5  14   6
1  20  17  11  10  25  23  20  23
2  15  14  22  25  11  15   5  15
3   9  27  15  27   7  15  17  23
4  12   6  11  13  27  11  26  20
5  27  13   5  16   5   5   2  18
6   3  18  22   0   7  10  11  11
7  25  18  10  11  29  29   1  25

我想要做的是在任何行中子选择满足特定条件的列,特别是我希望每列至少有一个数字=&gt; 27(仅作为例如)生成新的数据帧< / p>

    0   1   3   4   5   
0   9   0  13   2   5  
1  20  17  10  25  23  
2  15  14  25  11  15   
3   9  27  27   7  15  
4  12   6  13  27  11  
5  27  13  16   5   5  
6   3  18   0   7  10  
7  25  18  11  29  29  

我已经研究过pandas中的各种切片方法,但似乎没有做我想要的(.loc和.iloc等)。

到目前为止我用来阅读的实际脚本是

filename = 'Data.csv' 
data = pd.read_csv(filename,sep = ',')
x = data.ix[:,1:] # variables - species
y = data.ix[:,0] # cases - age

所以x的子数据框就是我所追求的(如上所述)。

非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

locilocix等索引器接受布尔数组。例如,如果您有三列,df.loc[:, [True, False, True]]将返回所有行以及列0和2(当对应值为True时)。您可以(df>=27).any()检查列中的任何元素是否大于或等于27。对于至少有一个值> = 27的列,这将返回True。因此,您可以使用以下内容对数据框进行切片:

df.loc[:, (df>=27).any()]
Out[34]: 
    0   1   3   4   5   7
0   8   2  28   9  14  21
1  24  26  23  17   0   0
2   3  24   7  15   4  28
3  29  17  12   7   7   6
4   5   3  10  24  29  14
5  23  21   0  16  23  13
6  22  10  27   1   7  24
7   9  27   2  27  17  12

这是最初的数据框:

df
Out[35]: 
    0   1   2   3   4   5   6   7
0   8   2   7  28   9  14  26  21
1  24  26  15  23  17   0  21   0
2   3  24  26   7  15   4   7  28
3  29  17   9  12   7   7   0   6
4   5   3  13  10  24  29  22  14
5  23  21  26   0  16  23  17  13
6  22  10  19  27   1   7   9  24
7   9  27  26   2  27  17   8  12