数据框布尔逻辑索引匹配

3
我创建了一个pandas数据框并希望根据某些布尔逻辑筛选数据。我想做的实际上更接近于Excel的“Index Match”功能,而不是简单的过滤。我研究了很多其他主题。
问题如下: 1. 当我应用我的筛选器时,数据框返回零个true值。为什么会返回零个true值,即使我对逻辑很灵活? 2. 如果我引入第五列,比如说D列,并使用random.randomint(100-1000,100)进行填充,那么我应该使用什么逻辑来有条件地找到只针对D列的最大值?也就是说,在返回多个true值的情况下,我能否强制pandas数据框只返回特定列中最高的true值?
非常感谢您的建议。提前致谢。
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
2个回答

4
您可以使用布尔索引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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接