首页 > 解决方案 > 根据许多条件过滤 Pandas 数据框

问题描述

我有一个大型数据框,其中包含一些模拟的输入和输出。输入为~100。对于每个独特的输入组合,存在一组独特的输出。我想为每个输入组合过滤数据框并检索相应的输出。我知道如何过滤数据框。对于这个小数据框:

input1 input2 input3 output1 output2
   a1    a2     a3      0      1
   a1    a4     a5      2      3
   a6    a2     a3      4      5

我可以:output_x = df[(df['input1']==a1) & (df['input2']==a2) & (df['input3']==a3)]['output1']

然后我可以遍历每个可能的输入组合并检索所有输出。但是如果输入的数量非常大怎么办?有没有办法不重复100次(df['inputX']==Y)?我正在考虑一个 pandas 函数,它检索一些数据框列的所有可能的值组合,并返回一些其他列的相应值。有这样的事情存在吗?

标签: python-3.xpandasdataframepandas-groupby

解决方案


您可以使用DataFrame.groupby

mask_columns_input=df.columns.str.contains('input')
inputs=[*df.columns[mask_columns_input]]
for i,group in df.groupby(inputs):
    print(group)

      input1 input2 input3  output1  output2
0     a1     a2     a3        0        1
  input1 input2 input3  output1  output2
1     a1     a4     a5        2        3
  input1 input2 input3  output1  output2
2     a6     a2     a3        4        5

仅显示输出:

mask_columns_input=df.columns.str.contains('input')
inputs=[*df.columns[mask_columns_input]]
for i,group in df.groupby(inputs):
    print(group.loc[:,~mask_columns_input])

输出:

   output1  output2
0        0        1
   output1  output2
1        2        3
   output1  output2
2        4        5

您还可以创建一个字典来保存:

df_by_inputs={''.join(i):group for i,group in df.groupby(inputs)}
for key in df_by_inputs:
    print(f'df_by_inputs[{key}]')
    print('-'*45)
    print(df_by_inputs[key])

df_by_inputs[a1a2a3]
---------------------------------------------
  input1 input2 input3  output1  output2
0     a1     a2     a3        0        1
0     a1     a2     a3        0        1
df_by_inputs[a1a4a5]
---------------------------------------------
  input1 input2 input3  output1  output2
1     a1     a4     a5        2        3
1     a1     a4     a5        2        3
df_by_inputs[a6a2a3]
---------------------------------------------
  input1 input2 input3  output1  output2
2     a6     a2     a3        4        5
2     a6     a2     a3        4        5

print(df_by_inputs['a1a2a3'])
  input1 input2 input3  output1  output2
0     a1     a2     a3        0        1
0     a1     a2     a3        0        1

推荐阅读