2016-11-30 2 views
0

Рассмотрим следующий df:Замена значений столбцов на основе строки местоположения

Vertex E1 E2 E3 E4 
1  2 4 
2  1 3 4 2 
3  2 4 
4  1 4 3 2 

Я хочу, чтобы заменить все элементы в столбцах [E1: E4] со значением, равным его соответствующей вершины (с 0).

df_output является:

Vertex E1 E2 E3 E4 
1  2 4 
2  1 3 4 0 
3  2 4 
4  1 0 3 2 

Е4 Vertex 2 был заменен на 0, когда значение было равно это вершинных число т.е. 2. Аналогично Е2 Vertex 4 был заменен на 0, как это было равно 4.

Я могу, очевидно, решить это путем итерации. Но что такое «Умиротворяющий» способ решения этого?

Дополнительная информация: Вышеупомянутая процедура заключается в том, чтобы удалить self-loops, если df соответствует матрице смежности графа.

Vertex E1 E2 E3 
1  2 4 
2  1 3 4 
3  2 4 
4  1 2 3 

(Это представляет adjacency list/matrix)

I "объединить" две вершины вместе, скажем, вершина 2 & 4, и в конечном итоге с:

Vertex E1 E2 E3 
1  4 4 
3  4 4 
4  1 4 3 

Как я получил это путем сбрасывания строка с вершиной 2 и заменяя все места краем на вершину 2 с помощью 4.

Теперь мне нужно удалить самопроверки, чтобы:

Vertex E1 E2 E3 
1  4 4 
3  4 4 
4  1 0 3 

как вершина 4 имела кромку к себе.

ответ

1

Вы можете использовать eq(,axis=0), чтобы получить логическую рамку данных, чтобы найти позиции, где значения должны быть 0, а затем назначить 0 к соответствующему Ячейки:

df.set_index('Vertex', inplace=True) 
df[df.eq(df.index.to_series(), axis = 0)] = 0 
df.reset_index() 

enter image description here

0

Использование DF.loc должен сделать трюк:

import pandas as pd 

index = [0,1,2,3] 
E1 = [2,1,2,1] 
E2 = [1,1,2,3] 
D = {'E1':E1,'E2':E2} 

DF = pd.DataFrame(data = D, index = index) 
DF.loc[DF.index == DF['E1'], ['E1']] = 0 
DF.loc[DF.index == DF['E2'], ['E2']] = 0 
print (DF) 

возвращает

E1 E2 
0 2 1 
1 0 0 
2 0 0 
3 1 0 
Смежные вопросы