数据帧布尔逻辑索引匹配

时间:2017-07-25 14:20:16

标签: python pandas dataframe

我创建了一个pandas数据框,并希望根据某些布尔逻辑过滤数据。基本上我想要做的是更接近excels的索引匹配功能而不是简单的过滤。我研究了很多其他的线程。

  1. 当我应用我的过滤器时,数据框返回零真值。当我灵活运用逻辑时,为什么返回零真值?和;

  2. 如果我使用'D'引入了第5列,比如列random.randomint(100-1000,100),我会使用什么逻辑来有条件地找到列D的最大值?即如果返回多个真值,是否可以强制数据框仅从某列返回最高真值?

  3. 建议非常感谢。提前谢谢。

    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
    

2 个答案:

答案 0 :(得分:4)

您可以boolean indexing使用isin

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

答案 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