我有一个数据框:
import pandas as pd
df = pd.DataFrame(np.random.randn(2, 4))
print(df)
0 1 2 3
0 1.489198 1.329603 1.590124 1.123505
1 0.024017 0.581033 2.500397 0.156280
我想选择至少有一行值大于2
的列。我尝试了以下方法,但它没有按预期工作。
df[df.columns[df.iloc[(0,1)]>2]]
在这个玩具示例中,我的预期输出是:
2
1.590124
2.500397
答案 0 :(得分:3)
使用gt
和any
过滤df:
In [287]:
df.ix[:,df.gt(2).any()]
Out[287]:
2
0 1.590124
1 2.500397
这里我们使用ix
来选择所有行,第一个:
和下一个arg是符合条件的列的布尔掩码:
In [288]:
df.gt(2)
Out[288]:
0 1 2 3
0 False False False False
1 False False True False
In [289]:
df.gt(2).any()
Out[289]:
0 False
1 False
2 True
3 False
dtype: bool
在您的示例中,您所做的是选择第一行和第二列的单元格值,然后尝试使用它来屏蔽列,但这只是返回第一列,因此它不起作用:
In [291]:
df.iloc[(0,1)]
Out[291]:
1.3296030000000001
In [293]:
df.columns[df.iloc[(0,1)]>2]
Out[293]:
'0'
答案 1 :(得分:2)
使用mask
创建的df > 2
与any
一起使用,然后按ix
选择列:
import pandas as pd
np.random.seed(18)
df = pd.DataFrame(np.random.randn(2, 4))
print(df)
0 1 2 3
0 0.079428 2.190202 -0.134892 0.160518
1 0.442698 0.623391 1.008903 0.394249
print ((df>2).any())
0 False
1 True
2 False
3 False
dtype: bool
print (df.ix[:, (df>2).any()])
1
0 2.190202
1 0.623391
通过评论编辑:
您可以检查每个部分的解决方案:
它似乎有效,但它总是选择第二列(1
,来自0
的python计数)列,如果条件为True
:
print (df.iloc[(0,1)])
2.19020235741
print (df.iloc[(0,1)] > 2)
True
print (df.columns[df.iloc[(0,1)]>2])
1
print (df[df.columns[df.iloc[(0,1)]>2]])
0 2.190202
1 0.623391
Name: 1, dtype: float64
第一列(0
)列如果False
,因为布尔True
和False
已投放到1
和0
:< / p>
np.random.seed(15)
df = pd.DataFrame(np.random.randn(2, 4))
print (df)
0 1 2 3
0 -0.312328 0.339285 -0.155909 -0.501790
1 0.235569 -1.763605 -1.095862 -1.087766
print (df.iloc[(0,1)])
0.339284706046
print (df.iloc[(0,1)] > 2)
False
print (df.columns[df.iloc[(0,1)]>2])
0
print (df[df.columns[df.iloc[(0,1)]>2]])
0 -0.312328
1 0.235569
Name: 0, dtype: float64
如果更改列名:
np.random.seed(15)
df = pd.DataFrame(np.random.randn(2, 4))
df.columns = ['a','b','c','d']
print (df)
a b c d
0 -0.312328 0.339285 -0.155909 -0.501790
1 0.235569 -1.763605 -1.095862 -1.087766
print (df.iloc[(0,1)] > 2)
False
print (df[df.columns[df.iloc[(0,1)]>2]])
0 -0.312328
1 0.235569
Name: a, dtype: float64
答案 2 :(得分:0)
快速更新,因为 .ix
现在已被弃用(自 0.20.0
起)。对于最新版本的 Pandas,.loc
可以解决问题:
df.loc[:, df.gt(2).any()]