2015-05-25 2 views
2

Я применяю некоторую обработку, такую ​​как замена матричного элемента от одного значения индекса матрицы к другому. он отлично работает.IndexError: индекс 1 за пределами оси 1 с размером 1

ds1 = [[ 4, 13, 6, 9], 
     [ 7, 12, 5, 7], 
     [ 7, 0, 4, 22], 
     [ 9, 8, 12, 0]] 

ds2 = [[ 4, 1], 
     [ 5, 3], 
     [ 6, 1], 
     [ 7, 2], 
     [ 4, 1 ], 
     [ 8, 2], 
     [ 9, 3], 
     [12, 1], 
     [13, 2], 
     [22, 3]] 

ds1= pd.DataFrame(ds1) 
ds2= pd.DataFrame(ds2) 

#Processing ds1 by replacing 
print type(ds2) 
ds2 = ds2.groupby(0).mean() #.........X 
print type(ds2) 
C = np.where(ds1.values.ravel()[:, None] == ds2.values[:, 0]) 
ds1_new = ds1.values.ravel() 
ds1_new[C[0]]=ds2.values[C[1], 1] #when I comment line x, it works.Otherwise getting error on this line 
ds1_new = ds1_new.reshape(4,4) 

Причина за использованием ds2 = ds2.groupby(0).mean() получает среднее значение подобных элементов. Когда я раскомментирую его, он работает без ошибок.

Версия

Python 2.7.3 
numpy - 1.9.2 
pandas - 0.15.2 

Редактировать

Моя главная цель состоит в том, чтобы соответствовать значению индекса из ds2 в ds1 и заменить его соответствующим значением, так что результат будет выглядеть

ds1_new = [[ 1, 2, 1, 3], 
     [ 2, 1, 3, 2], 
     [ 2, 0, 1, 3], 
     [ 3, 2, 1, 0]] 
+1

У меня нет ошибок при запуске вашего кода – EdChum

+0

@EdChum: Я обновил свою версию, может ли это быть из-за версии? – nlper

+0

Это не такая старая версия, в основном вы назначаете именованную ссылку, поэтому не имеет значения, что делает эта группа, она не вызывает ошибки – EdChum

ответ

1

Держу пари, что это будет проще, чем вы ожидали. Во-первых, давайте сделаем ds2 словарем, а не файловым кадром.

ds2 = dict([ 
     [ 4, 1], 
     [ 5, 3], 
     [ 6, 1], 
     [ 7, 2], 
     [ 4, 1], 
     [ 8, 2], 
     [ 9, 3], 
     [12, 1], 
     [13, 2], 
     [22, 3]]) 

Теперь мы будем использовать ds2 непосредственно отобразить все элементы в ds1:

ds3 = ds1.copy() 
for i in range(4): 
    ds3[i] = ds3[i].map(ds2) 

    0 1 2 3 
0 1 2 1 3 
1 2 1 3 2 
2 2 NaN 1 3 
3 3 2 1 NaN 

Если вы хотите 0 «S вместо NaN, просто сделать ds3.fillna(0).

По какой-то причине, я не мог получить эту работу:

ds3.applymap(ds2) 

Но это работает, и позволяет избежать зацикливания по столбцам, хотя синтаксис не совсем так просто, как для серии:

ds1.applymap(lambda x: ds2.get(x,0)) 
+0

Большое спасибо, пожалуйста, посмотрите наhttp: //stackoverflow.com/questions/30489216/matrix-processing-using-pandas-fails-on-larger-data-size – nlper

Смежные вопросы