根据许多条件过滤熊猫数据框

时间:2019-11-09 00:32:02

标签: python-3.x pandas dataframe pandas-groupby

我有一个很大的数据框,其中包含一些模拟的输入和输出。 输入约为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函数,该函数检索某些数据框列的值的所有可能组合,并返回其他列的对应值。像那样的东西存在吗?

1 个答案:

答案 0 :(得分:2)

您可以使用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