我创建了一个pandas数据框,并希望根据某些布尔逻辑过滤数据。基本上我想要做的是更接近excels的索引匹配功能而不是简单的过滤。我研究了很多其他的线程。
当我应用我的过滤器时,数据框返回零真值。当我灵活运用逻辑时,为什么返回零真值?和;
如果我使用'D'
引入了第5列,比如列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
答案 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