![](/img/trans.png)
[英]How to select rows based on specific conditions of a range of columns in pandas
[英]Pandas Python, select columns based on rows conditions
我有一個數據框:
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
使用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'
將使用df > 2
創建的mask
與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
通過評論編輯:
您可以檢查每個部分的解決方案:
看起來它有效,但如果條件為True
,它總是選擇第二列( 1
,python count from 0
)列:
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
:
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
快速更新,因為.ix
現在已被棄用(自0.20.0
)。 對於最新版本的熊貓, .loc
可以解決問題:
df.loc[:, df.gt(2).any()]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.