2016-02-07 2 views
2

Скажем, у меня есть два dataframes:ValueError: не может проиндексировать от дубликата оси

import string 
import pandas as pd 

d = {'one': pd.Series(range(26), index = list(string.ascii_lowercase)), 
    'two': pd.Series([1., 2., 3., 4.], index = ['a', 'b', 'c', 'd'])} 
df = pd.DataFrame(d) 

d2 = {'one': pd.Series(range(10), index = range(11, 21))} 
df2 = pd.DataFrame(d2) 

Теперь у меня есть список индексов:

np.random.seed(12) 
i = np.random.choice(np.arange(11, 21), size = 26) 

Теперь я хочу присоединиться к df2 с df1 на основе на i.

df['new_col'] = df2['one'][i] 

Но я получаю вышеупомянутую ошибку. Один из способов обойти это - добавить i непосредственно в df1 и создать столбец i в df2 для представления index, а затем сделать merge, но он кажется очень неэффективным. Есть лучший способ сделать это?

Я знаю, что есть несколько вопросов с одним и тем же названием, но ни у кого из них не было ничего полезного для моего дела.

+0

Какой результат вы ожидаете? – Goyo

ответ

4

Вы можете использовать tolist метод для преобразования df2.one в список, а затем присвоить его df['new_col']:

df['new_col'] = df2['one'][i].tolist() 

EDIT

Или вы могли бы использовать .values атрибут, как @ajcr предложил в комментарии, который быстрее:

df['new_col'] = df2['one'][i].values 

Timing

In [100]: %timeit df2.one[i].tolist() 
1000 loops, best of 3: 275 µs per loop 

In [101]: %timeit df2.one[i].values 
1000 loops, best of 3: 252 µs per loop 
+2

Вместо этого вы можете использовать '.values', т. Е.' Df ['new_col'] = df2.loc [i, 'one']. Values'. Создание списка дороже, чем создание массива здесь. –

+0

@ajcr спасибо, добавлено в ответ. Сроки показывают, что это не так быстро –

+1

@ Антон Уверен, что это будет с большими кадрами данных. – Goyo

1

Установить индекс для использования значения, сгенерированные в «я», а затем присоединиться к df2 ДФ на основе этого показателя:

df = df.set_index(i) 
df['new_col'] = df2['one'] 
Смежные вопросы