2017-07-25 44 views
3

我創建了一個熊貓數據框,並希望根據某些布爾邏輯過濾數據。基本上,我想要做的更接近卓越的索引匹配功能,而不是簡單的過濾。我研究了很多其他線程。數據幀布爾邏輯索引匹配

  1. 當我應用我的過濾器時,數據框返回零真值。爲什麼當我的邏輯靈活時,返回零真值?和;

  2. 如果我介紹了第5列,說柱'D',與random.randomint(100-1000,100),我會用什麼邏輯有條件地找到最大值僅爲D列?即如果返回多個真值,我是否可以強制數據框僅從某個列返回最高的真值?

建議非常感謝。先謝謝你。

import pandas as pd 

df = pd.DataFrame({ 
    'Step': [1,1,1,1,1,1,2,2,2,2,2,2], 
    'A': [4,5,6,7,4,5,6,7,4,5,6,7], 
    'B': [10,20,30,40,10,20,30,40,10,20,30,40], 
    'C': [0,0.5,1,1.5,2,2.5,0,0.5,1,1.5,2.0,2.5] 
}) 

columns = ['Step','A','B','C'] 

df=df[columns] 

new_df=df[(df.Step == 1) & (df.A == 4|5|6|7) & (df.B == 10|20|30|40)] 
new_df 
+1

你可以爲'2.'添加一些示例嗎?你需要一個最大的價值? – jezrael

回答

4

您可以使用boolean indexingisin

new_df=df[(df.Step == 1) & (df.A.isin([4,5,6,7])) & (df.B.isin([10,20,30,40]))] 

這似乎對於第二個問題需要DataFrame.nlargest

np.random.seed(789) 
df = pd.DataFrame({ 
    'Step': [1,1,1,1,1,1,2,2,2,2,2,2], 
    'A': [4,5,6,7,4,5,6,7,4,5,6,7], 
    'B': [10,20,30,40,10,20,30,40,10,20,30,40], 
    'C': [0,0.5,1,1.5,2,2.5,0,0.5,1,1.5,2.0,2.5], 
    'D':np.random.choice(np.arange(100,1000,100), size=12) 
}) 
print (df) 
    A B C D Step 
0 4 10 0.0 400  1 
1 5 20 0.5 300  1 
2 6 30 1.0 200  1 
3 7 40 1.5 400  1 
4 4 10 2.0 500  1 
5 5 20 2.5 900  1 
6 6 30 0.0 500  2 
7 7 40 0.5 200  2 
8 4 10 1.0 900  2 
9 5 20 1.5 100  2 
10 6 30 2.0 200  2 
11 7 40 2.5 200  2 

new_df= df[(df.Step == 1)&(df.A.isin([4,5,6,7]))&(df.B.isin([10,20,30,40]))].nlargest(1,'D') 
print (new_df) 
    A B C D Step 
5 5 20 2.5 900  1 
4

使用DataFrame.query()方法:

In [7]: new_df = df.query("Step==1 and A in [4,5,6,7] and B in [10,20,30,40]") 

In [8]: new_df 
Out[8]: 
    Step A B C 
0  1 4 10 0.0 
1  1 5 20 0.5 
2  1 6 30 1.0 
3  1 7 40 1.5 
4  1 4 10 2.0 
5  1 5 20 2.5