从熊猫数据框中删除行和列

时间:2019-01-14 06:11:29

标签: python pandas user-interface

我有一个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。...最好用逗号分隔

2 个答案:

答案 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应该是您想要的形式。