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