Фильтрация данных Pandas по многим критериям - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть большой фрейм данных, который содержит входы и выходы некоторых симуляций. Входы ~ 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 Ответ

2 голосов
/ 09 ноября 2019

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...