Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于值以批处理方式删除数据帧行和列_Python_Pandas_Dataframe - Fatal编程技术网

Python 基于值以批处理方式删除数据帧行和列

Python 基于值以批处理方式删除数据帧行和列,python,pandas,dataframe,Python,Pandas,Dataframe,背景:我有一个表示两点之间距离的矩阵。在该矩阵中,行和列都是数据点。例如: A B C A 0 999 3 B 999 0 999 C 3 999 0 在这个玩具示例中,让我们假设出于某种原因我想要去掉C,因为它远离任何其他点。因此,我首先汇总计数: df["far_count"] = df[df == 999].count() 然后批量删除它们: df = df[df["far_count"] == 2] 在这个例子中,这看起来有点多余,但请想象一下,我有

背景:我有一个表示两点之间距离的矩阵。在该矩阵中,行和列都是数据点。例如:

   A   B   C
 A 0   999 3
 B 999 0   999
 C 3   999 0
在这个玩具示例中,让我们假设出于某种原因我想要去掉C,因为它远离任何其他点。因此,我首先汇总计数:

df["far_count"] = df[df == 999].count()
然后批量删除它们:

df = df[df["far_count"] == 2]
在这个例子中,这看起来有点多余,但请想象一下,我有很多像这样的数据点,比如说,在10Ks的范围内

上述批处理删除的问题是,我希望同时删除行和列,而不仅仅是行,我不清楚如何优雅地执行此操作。一种简单的方法是获取此类数据点的列表并将其放入循环中,然后:

for item in list:
  df.drop(item, axis=1).drop(item, axis=0)
但我想知道是否有更好的方法。如果我们能跳过中间步骤,我们会得到奖励

对于您的特定情况,因为数组是对称的,所以您只需要检查一维

m = (df.values == 999).sum(0) == len(df) - 1
l = ['A', 'C']
m = df.index.isin(l)

df.loc[~m, ~m]

   B  D  E
B  0  5  2
D  5  0  3
E  2  3  0
m = (df.values == 999).sum(0) == len(df) - 1
In [66]: x = pd.DataFrame(np.triu(df), df.index, df.columns)

In [67]: x
Out[67]:
   A    B    C
A  0  999    3
B  0    0  999
C  0    0    0

In [68]: mask = x.ne(999).all(1) | x.ne(999).all(0)

In [69]: df.loc[mask, mask]
Out[69]:
   A  C
A  0  3
C  3  0