按条件子集数据框中的索引提取列

Sim101011

我有一个数据框:

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randn(8, 4))
df.columns = ['a','b','c','d']
print(df)
          a         b         c         d
0  2.454522  1.609990  1.218581 -0.133827
1  0.462152  0.939479 -0.626329  1.169886
2  0.334338 -1.188042 -1.387660 -1.874766
3  0.576941 -0.362167  2.321634  1.415192
4 -0.234557 -1.468935 -1.090757  1.392798
5 -1.316241  0.939276  0.508557  1.187436
6  1.140832  1.588225 -0.046766 -0.329412
7 -1.533695 -0.565144 -0.133613 -1.941484

我想选择值大于零的第二列的行。这我可以做到

df1 = df.loc[df.iloc[:,0] >= 0]
          a         b         c         d
0  2.454522  1.609990  1.218581 -0.133827
1  0.462152  0.939479 -0.626329  1.169886
2  0.334338 -1.188042 -1.387660 -1.874766
3  0.576941 -0.362167  2.321634  1.415192
6  1.140832  1.588225 -0.046766 -0.329412

但我的要求是 df1 应该只包含第二列和第四列。

          b         d
0  1.609990 -0.133827
1  0.939479  1.169886
2 -1.188042 -1.874766
3 -0.362167  1.415192
6  1.588225 -0.329412

我可以这样做

df1 = df1.iloc[:, [1,3]]

我可以在同一行代码中使用列名和索引在行上应用条件吗?

耶斯列

选择带有索引的列:

print (df.columns[[1,3]])
Index(['b', 'd'], dtype='object')

df1 = df.loc[df.iloc[:,0] >= 0, df.columns[[1,3]]]
print (df1)
          b         d
0  1.609990 -0.133827
1  0.939479  1.169886
2 -1.188042 -1.874766
3 -0.362167  1.415192
6  1.588225 -0.329412

因为iloc没有实施解决方案

df1 = df.iloc[df.iloc[:,0] >= 0, [1,3]]

NotImplementedError: 基于 iLocation 的整数类型的布尔索引不可用

但如果将掩码转换为 numpy 数组,它工作得很好:

df1 = df.iloc[df.iloc[:,0].values >= 0, [1,3]]
print (df1)
          b         d
0  1.609990 -0.133827
1  0.939479  1.169886
2 -1.188042 -1.874766
3 -0.362167  1.415192
6  1.588225 -0.329412

使用列名就更简单了:

df1 = df.loc[df.iloc[:,0] >= 0, ['b','d']]
print (df1)
          b         d
0  1.609990 -0.133827
1  0.939479  1.169886
2 -1.188042 -1.874766
3 -0.362167  1.415192
6  1.588225 -0.329412

编辑:

有一个小的错字,第二列需要df.iloc[:,1]

df1 = df.loc[df.iloc[:,1] >= 0, df.columns[[1,3]]]
df1 = df.iloc[df.iloc[:,1].values >= 0, [1,3]]
df1 = df.loc[df.iloc[:,1] >= 0, ['b','d']]

print (df1)

          b         d
0  1.609990 -0.133827
1  0.939479  1.169886
5  0.939276  1.187436
6  1.588225 -0.329412

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章