Python 使用多个变量/输入查询数据帧列

Python 使用多个变量/输入查询数据帧列,python,pandas,Python,Pandas,我遇到了一种情况,我需要通过以下列P1-P5中的输入过滤数据帧。可以有1到5个输入,它们可以位于P1-P5的任何位置 TeamAbb P1 P2 P3 P4 P5 0 ATL1 203953 1627745 1629027 1629629 1629631 1 ATL2 203953 1627745 1627761 1629027 1629631 2 ATL3 203458 203953 1627761 1

我遇到了一种情况,我需要通过以下列P1-P5中的输入过滤数据帧。可以有1到5个输入,它们可以位于P1-P5的任何位置

   TeamAbb    P1       P2      P3      P4      P5
0     ATL1  203953  1627745 1629027 1629629 1629631
1     ATL2  203953  1627745 1627761 1629027 1629631
2     ATL3  203458  203953  1627761 1629027 1629631
3     ATL4  203458  203953  1629027 1629629 1629631
4     ATL5  203458  1628381 1629027 1629629 1629631
5     ATL6  203953  1628981 1628989 1629027 1629631
6     ATL7  203953  1627745 1628989 1629027 1629631
7     ATL8  1713    202323  203459  1627761 1628981
8     ATL9  1713    203459  1628981 1629027 1629631
例1

input_val = [1713]

   TeamAbb    P1       P2      P3      P4      P5
7     ATL8  1713    202323  203459  1627761 1628981
8     ATL9  1713    203459  1628981 1629027 1629631
例2

input_val = [1713,202323]

   TeamAbb    P1       P2      P3      P4      P5
7     ATL8  1713    202323  203459  1627761 1628981

到目前为止,我尝试过的每种方法都不起作用(查询、应用/任何和掩码)。如果有人对如何处理这个问题有想法,我会非常感激

您可以
求和
列表中每个值的所有布尔数据帧,然后在
轴=1上求和得到的数据帧,然后检查它是否与输入列表的长度相同:

input_val = [1713,202323]
mask = sum([df.eq(i) for i in input_val]).sum(1).eq(len(input_val))

print (df[mask])
  TeamAbb    P1      P2      P3       P4       P5
7    ATL8  1713  202323  203459  1627761  1628981

我将跨行使用apply,并检查输入集和行集的差异:

input_val = [1713,202323]
df_filter = (
             df[['P{}'.format(i) for i in range(1,6)]]
             .apply(lambda row: len(set(input_val) - set(row)) == 0 # check that all input vals are found somewhere in the row
                    , axis=1)
            ) 
df_new = df[df_filter] # apply the filter

我认为这会达到你想要的结果:

ee = df
ee = e.isin([1713]) 
ee ['match'] = ee[ee>0].count(axis=1) 
df.loc[ee['match']==ee['match'].max()] 
输出:

  TeamAbb    P1      P2       P3       P4       P5
7    ATL8  1713  202323   203459  1627761  1628981
8    ATL9  1713  203459  1628981  1629027  1629631
  TeamAbb    P1      P2      P3       P4       P5
7    ATL8  1713  202323  203459  1627761  1628981
输入:

ee = df
ee = e.isin([1713, 202323]) 
ee ['match'] = ee[ee>0].count(axis=1) 
df.loc[ee['match']==ee['match'].max()] 
输出:

  TeamAbb    P1      P2       P3       P4       P5
7    ATL8  1713  202323   203459  1627761  1628981
8    ATL9  1713  203459  1628981  1629027  1629631
  TeamAbb    P1      P2      P3       P4       P5
7    ATL8  1713  202323  203459  1627761  1628981
输入

输出

  TeamAbb      P1       P2       P3       P4       P5
5    ATL6  203953  1628981  1628989  1629027  1629631
6    ATL7  203953  1627745  1628989  1629027  1629631

哦,是的,我知道,我只是快速浏览了一下例子。谢谢你的帮助。