Pandas Python,根据行条件选择列

时间:2016-06-30 08:09:24

标签: python pandas dataframe conditional-statements

我有一个数据框:

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 

3 个答案:

答案 0 :(得分:3)

使用gtany过滤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 > 2any一起使用,然后按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,因为布尔TrueFalse已投放到10:< / 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()]