我在我的项目中实现了实验环境。
该组件基于Scikit learn。
在这个组件中,我将给定的CSV读入pandas数据框架。之后,我选择了最好的特征,并将给定数据框的维度从100降至5。之后,我将删除的ID列添加到这个减少的数据框中,以备将来使用。该列通过降维过程被删除。
一切正常,直到我改变我的代码读取所有CSV文件并返回一个联合数据帧:
请查看下一个代码:读取所有CSV:
dataframes = []
from os import listdir
from os.path import isfile, join
files_names = [f for f in listdir(full_path_directory_files) if isfile(join(full_path_directory_files, f))]
for file_name in files_names:
full_path_file = full_path_directory_files + file_name
data_frame = pd.read_csv(full_path_file, index_col=None, compression="infer")
dataframes.append(dataframe)
之后,我在数据帧
之间进行了连接features_dataframe = pd.concat(dataframes, axis=0)
我也检查过了。我用shape =(200,100)创建了两个不同的数据框架连接后变成(400,100)
之后,数据帧被发送到以下方法:
def _reduce_dimensions_by_num_of_features(self, features_dataframe, truth_dataframe, num_of_features):
print("Create dataframe with the {0} best features".format(num_of_features))
## In those functions I got the ids and their class
ids, id_series = self._create_ids_by_dataframe(features_dataframe)
features_dataframe_truth_class = self._extract_truth_class_by_truth_dataframe(truth_dataframe, ids)
k_best_classifier = SelectKBest(score_func=f_classif, k=num_of_features)
k_best_features = k_best_classifier.fit_transform(features_dataframe, features_dataframe_truth_class)
reduced_dataframe_column_names = self._get_k_best_feature_names(k_best_classifier, features_dataframe)
reduced_dataframe = pd.DataFrame(k_best_features, columns=reduced_dataframe_column_names)
现在我检索ID列:
reduced_dataframe["Id"] = id_series
软件在消息上出错:
ValueError: cannot reindex from a duplicate axis
这只发生在数据帧连接之后。
我如何将id列添加到数据框中而不出现错误?
我发现问题了:
数据帧连接后,索引被改变,当我们添加一行时:
reduced_dataframe["Id"] = id_series
我们得到一个错误。
解决方法是重置索引:
features_dataframe = pd.concat(dataframes, axis=0)
features_dataframe.reset_index(drop=True, inplace=True)