我有一个数据框:
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] 删除。
我来说两句