根据行位置

时间:2016-11-30 02:39:47

标签: python pandas

考虑以下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

顶点2的E4被替换为0,因为该值等于它的顶点数,即2.类似地,顶点4的E2被替换为0,因为它等于4。

我显然可以通过迭代来解决这个问题。但解决这个问题的可行方法是什么?

额外信息: 如果df对应于图的邻接矩阵,则上述过程是删除自循环。

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

(这代表adjacency list/matrix

我将两个顶点合并在一起,比如顶点2和顶点。 4,最后得到:

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

我如何获得它是通过删除顶点2的行并用边缘将所有边缘替换为顶点2的位置。

现在我需要删除自循环,以便:

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

因为顶点4有自己的边缘。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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