【问题标题】:Filter Pandas dataframe over many criteria根据许多条件过滤 Pandas 数据框
【发布时间】:2019-11-09 00:32:02
【问题描述】:

我有一个大型数据框,其中包含一些模拟的输入和输出。 输入为~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 函数,它检索一些数据框列的所有可能的值组合,并返回一些其他列的相应值。有这样的东西吗?

【问题讨论】:

  • 我想你想要 groupby
  • 我试图调查一下,但我不明白如何将它应用到我的案例中
  • 你能展示一个更宽的数据框和预期的输出吗?
  • 这和我贴在那里的完全一样,只是输入从 input1 到 input100。每一行都包含不同的输入组合,包括字符串和数字。输出是数字,代表能量值,可以从 0 到无穷大。
  • 那么您想获取 Input 中每个组合的所有可能数据框吗?

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


【解决方案1】:

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

【讨论】:

  • 我想你想将.to_list() 添加到inputs=[*df.columns[mask_columns_input]] 像这样:inputs=[*df.columns[mask_columns_input]].to_list() 否则我会出错
  • [*df.columns[mask_columns_input]] 是一个列表。我们也可以使用tolist():df.columns[mask_columns_input].tolist()
猜你喜欢
  • 2020-08-29
  • 1970-01-01
  • 2017-12-15
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多