我有一个CSV文件,其中包含一个对称的邻接矩阵,这意味着行和列具有相同的标签。
我想将其导入到pandas数据框中,理想情况下会弹出一些GUI,并要求删除要删除的项目。...然后将其放入其中,并将相对行和列中的值设置为零并返回一个单独的更改后的数据帧。
简而言之,它采用以下矩阵
a b c d e
a 0 3 5 3 5
b 3 0 2 4 5
c 5 2 0 1 7
d 3 4 1 0 9
e 5 5 7 9 0
弹出一个简单的界面,询问“应删除哪些区域”和一行输入这些区域的行
说输入c和e
返回
a b c d e
a 0 3 0 3 0
b 3 0 0 4 0
c 0 0 0 0 0
d 3 4 0 0 0
e 0 0 0 0 0
条目已更改,如粗体显示
它应该能够在输入的尽可能多的区域执行此操作,最多可以输入379。...最好用逗号分隔
答案 0 :(得分:4)
使用DataFrame.loc
通过索引值设置列和行:
vals = ['c','e']
df.loc[vals, :] = 0
df[vals] = 0
#alternative
#df.loc[:, vals] = 0
print (df)
a b c d e
a 0 3 0 3 0
b 3 0 0 4 0
c 0 0 0 0 0
d 3 4 0 0 0
e 0 0 0 0 0
另一种解决方案是使用numpy广播创建布尔型掩码,并通过DataFrame.mask
设置值:
mask = df.index.isin(vals) | df.columns.isin(vals)[:, None]
df = df.mask(mask, 0)
print (df)
a b c d e
a 0 3 0 3 0
b 3 0 0 4 0
c 0 0 0 0 0
d 3 4 0 0 0
e 0 0 0 0 0
答案 1 :(得分:1)
首先导入csv:
import pandas as pd
adj_matrix = pd.read_csv("file/name/to/your.csv", index_col=0)
然后请求输入:
regions = input("Please enter the regions that you want deleted (as an array of strings)")
adj_matrix.loc[regions, :] = 0
adj_matrix.loc[:, regions] = 0
现在adj_matrix
应该是您想要的形式。