考虑以下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
我将两个顶点合并在一起,比如顶点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有自己的边缘。
答案 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()
答案 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