熊猫:从另一个数据框的数据框基础条件中删除多行

时间:2020-01-26 16:16:25

标签: python pandas dataframe

我想从给定的输入excel文件(InputFile_1.xlsx)准备所有可能组合的跨产品列表。第一个输入文件包含列名以及每个列可以具有的所有可能值。但是,作为附加条件,我想过滤掉所有作为其他输入文件(InputFile_2.xlsx)的所有组合

#InputFile_1.xlsx
#   Col1 Col2 Col3 Col4 Col5 Col6 Col7
#0   1    1    1    1    1    1    1
#1   2    2    2    2    2    2    2
#2   3    3    3    3    3    3    3
#3   4    4    4    4    4    4    4
#4   5    5    5    5    5    5    99
#5   6    6    6    6    99   6
#6   99   99   99   99   99   99

#InputFile_2.xlsx(Combinations to be skipped)
#   Col1 Col2 Col3 Col4 Col5 Col6 Col7
#0   1    2    *    *    *    *    *
#1   2    2    *    *    *    *    *
#2   1    3    *    *    *    *    *
#3   1    *    1    *    *    *    *
#4   *    5    5    *    4    5    *
.....
.....

我能够在此输入数据框上使用itertools.product准备组合,但无法从此主列表中删除组合。在我到目前为止的代码下面分享:

from pandas import DataFrame
from itertools import product

input_codes_df = pd.read_excel(open('combinationsInput.xlsx', 'rb'), sheet_name='Codes')
input_prohibitions_df = pd.read_excel(open('combinationsInput.xlsx', 'rb'), sheet_name='Prohibitions')

arr_attr = list(input_codes_df.columns)
arr_master_list = []

for attr_identifier in arr_attr:
    input_codes_df[attr_identifier] = pd.to_numeric(input_codes_df[attr_identifier], errors='coerce')
    tmp_list = list(input_codes_df[input_codes_df[attr_identifier].notnull()][attr_identifier])
    arr_master_list.append(tmp_list)

comb_df = pd.DataFrame(list(product(*arr_master_list)))
comb_df.to_csv('allCombinationsOutput.csv',index=False)

toBeRemovedIndexArrays = []
for index, row in input_prohibitions_df.iterrows():
    for col in arr_columns:
        if row[arr_columns[col]] != '*':
            #Add to condition array
            #toBeRemovedIndexArrays.append()
            #input_prohibitions_df[arr_columns[col]] == row[arr_columns[col]]

#Example condition
indexNames = input_codes_df[ (input_prohibitions_df[arr_columns[0]] == 1) & (input_prohibitions_df[arr_columns[1]] == 2) ].index

input_codes_df.drop(indexNames , inplace=True)
#input_codes_df.drop(toBeRemovedIndexArrays , inplace=True) #Collectively delete all the indexes at once

谢谢。

0 个答案:

没有答案