2015-04-08 9 views
1

Я хотел бы удалить строки из фреймворка pandas с использованием значения MultiIndex.pandas dataframe drop rows by multiindex

Я пробовал немало вещей, но я поставил ниже то, что, по моему мнению, было ближе. (На самом деле я объясню полную проблему, так как могут быть альтернативные решения, использующие совершенно другой подход). Из матрицы корреляции я хотел бы получить пару столбцов, которые больше коррелируют. Я использую unstack и поместить результаты в dataframe:

In [263]: corr_df = pd.DataFrame(total.corr().unstack()) 

Затем получить более высокие корреляции (на самом деле я должен получить негативы, а).

In [264]: high = corr_df[(corr_df[0] > 0.5) & (corr_df[0] < 1.0)] 

In [236]: print high 
                0 
residual sugar  density    0.552517 
free sulfur dioxide total sulfur dioxide 0.720934 
total sulfur dioxide free sulfur dioxide 0.720934 
        wine     0.700357 
density    residual sugar  0.552517 
wine     total sulfur dioxide 0.700357 

Закрыто достаточно, но есть дубликаты, на самом деле это точка корреляционной матрицы. Для того, чтобы очистить их, моя идея состоит в том, чтобы повторять высокие значения для удаления дубликатов:

In [267]: 
for row in high.iterrows(): 
    print row[0][0], ",", row[0][1] 
    print high.loc[row[0][1]].loc[row[0][0]].index 
    high.drop(high.loc[row[0][1]].loc[row[0][0]].index) 
residual sugar , density 
Int64Index([0], dtype='int64') 
--------------------------------------------------------------------------- 
KeyError         Traceback (most recent call last) 
<ipython-input-267-1258da2a4772> in <module>() 
     2  print row[0][0], ",", row[0][1] 
     3  print high.loc[row[0][1]].loc[row[0][0]].index 
----> 4  high.drop(high.loc[row[0][1]].loc[row[0][0]].index) 

... 
[huge stack of errors] 
... 
KeyError: 0 

Метод drop работает отлично, когда индекс является нормальным (см drop), но, как я строю label когда я получил MultiIndex?

ответ

2
corr_df = pd.DataFrame(
{'residual sugar': [1, 0, 0, 0.552517, 0], 
'free sulfur dioxide': [0, 1, 0.720934, 0, 0], 
'total sulfur dioxide': [0, 0.720934, 1, 0, 0.700357], 
'density': [0.552517, 0, 0, 1, 0], 
'wine': [0, 0, 0.700357, 0, 1]}, 
index=['residual sugar', 'free sulfur dioxide', 'total sulfur dioxide', 'density', 'wine']).unstack() 

# Notice the slight modification to the original 
high = corr_df[(corr_df > 0.5) & (corr_df < 1.0)] 

# Sort by index, then values 
high.sort_index() 
high.sort() 

# Drop every other value (e.g. just take the evens) 
result = high.iloc[[count for count, _ in enumerate(high) if count % 2 == 0]] 
>>> result 
density    residual sugar   0.552517 
total sulfur dioxide wine     0.700357 
free sulfur dioxide total sulfur dioxide 0.720934 
Смежные вопросы