Как решить ValueError: не удается переиндексировать с дублирующейся оси в Python - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть набор данных всех категориальных столбцов, из которых мне нужно найти пропорции target_class, то есть 1 в каждом уровне категориальной переменной.А затем добавьте корреляцию каждого уровня с target_class, создав фиктивную переменную.Ниже приведен пример входных данных и ожидаемого вывода:

#Input Data:

df_data = pd.DataFrame(
{'production' : ['1101100000','1101100000','100100000','100100000','1101100000','1101100000','1001000000','1101100000','1101100000','1101100000'],
'enc_svod' : ['Free','Free','Pay','','Pay','Free','Free','','','Pay'],
'status' : [1,0,0,0,1,0,0,0,0,1]}
)

Код для поиска пропорций и корреляции с target_class:

cat_cols = ['production','enc_svod']

# Code to find proportions and correlation with target_class:
# Now traverse through each column and calculate correlation and generate 
metrics
cat_count = 0
cat_metrics_df = pd.DataFrame()


for each_col in cat_cols:
    df_temp = pd.DataFrame()
    df_single_col_data = df_data[[each_col]]
    cat_count += 1

# Calculate uniques and nulls in each column to display in log file.    

    uniques_in_column = len(df_single_col_data[each_col].unique())
    nulls_in_column = df_single_col_data.isnull().sum()


    print('Working on column %s, converting to dummies and finding correlation with target' %(each_col))
    df_categorical_attribute = pd.get_dummies(df_single_col_data[each_col].astype(str), dummy_na=True, prefix=each_col)
    df_categorical_attribute = df_categorical_attribute.loc[:, df_categorical_attribute.var() != 0.0]# Drop columns with 0 variance.

    df_temp['correlation'] = df_categorical_attribute.corrwith(df_data['status'])

    try:
    # Calculate Index : Proportions of 1's within each CAT level

        frames = [df_single_col_data,df_data['status']]
        df_proportions = pd.concat(frames,axis = 1)
        df_proportions = df_proportions.fillna('nan').groupby(each_col,as_index = True).mean()
        df_proportions.index = [str(df_proportions.index.name) + '_' + str(x) for x in df_proportions.index.values]


        df_temp['Index'] = df_temp.join(df_proportions)['status']
        df_temp['Attribute'] = str(each_col)
        cat_metrics_df = cat_metrics_df.append(df_temp)
    except ValueError:
        print("Error for column %s:" %(each_col))
        continue

Причина, по которой я пробую, кроме как здесь, заключается в том, что для некоторых переменныхОшибка значения Ошибка, как показано ниже:

Traceback (most recent call last):
  File "/user/data_processing_functions.py", line 443, in metrics_categorical
    df_temp['Index'] = df_temp.join(df_proportions)['disco_status']
  File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py", line 2331, in __setitem__
    self._set_item(key, value)
  File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py", line 2397, in _set_item
    value = self._sanitize_column(key, value)
  File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py", line 2547, in _sanitize_column
    value = reindexer(value)
  File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py", line 2539, in reindexer
    raise e
  File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py", line 2534, in reindexer
    value = value.reindex(self.index)._values
  File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/series.py", line 2426, in reindex
    return super(Series, self).reindex(index=index, **kwargs)
  File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py", line 2515, in reindex
    fill_value, copy).__finalize__(self)
  File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py", line 2533, in _reindex_axes
    copy=copy, allow_dups=False)
  File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py", line 2627, in _reindex_with_indexers
    copy=copy)
  File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/internals.py", line 3886, in reindex_indexer
    self.axes[axis]._can_reindex(indexer)
  File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/indexes/base.py", line 2836, in _can_reindex
    raise ValueError("cannot reindex from a duplicate axis")
ValueError: cannot reindex from a duplicate axis

Для некоторых столбцов существует больше уникальных значений (19), чем число категорий, оставшихся после:

df_categorical_attribute = df_categorical_attribute.loc[:, df_categorical_attribute.var() != 0.0]# Drop columns with 0 variance.

Это происходит, когдаЯ запускаю его на сервере, на котором установлена ​​версия 0.20.3 для панд, тогда как на моем локальном компьютере это самая последняя версия - 0.23.4.Я не уверен, является ли это причиной или есть какая-то другая причина этой ошибки.Я подумал об использовании Try Except, чтобы в случае таких ошибок ValueError пропустить этот столбец.Я не уверен, почему это происходит, я предполагаю, что из-за пробелов в целых данных - 2,5 миллиона строк * 1200 столбцов (я использую выборку - 50000 на локальном уровне), которые, возможно, не фиксируют те случаи, я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...