背景:我有一个表示两点之间距离的矩阵。在这个矩阵中,行和列都是数据点。例如:
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]
在这个例子中,这看起来有点多余,但请想象一下我有很多这样的数据点(比如 10K 的数量级)
上述批量删除的问题是,我想同时删除行和列(而不仅仅是行),但我不清楚如何优雅地做到这一点。一种简单的方法是获取此类数据点的列表并将其放入循环中,然后:
for item in list:
df.drop(item, axis=1).drop(item, axis=0)
但是我想知道是否有更好的方法。 (如果我们可以跳过中间步骤far_count
,那就更好了)
最佳答案
np.random.seed([3,14159])
idx = pd.Index(list('ABCDE'))
a = np.random.randint(3, size=(5, 5))
df = pd.DataFrame(
a.T.dot(a) * (1 - np.eye(5, dtype=int)),
idx, idx)
df
A B C D E
A 0 4 2 4 2
B 4 0 1 5 2
C 2 1 0 2 6
D 4 5 2 0 3
E 2 2 6 3 0
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
关于python - 根据值以批量方式删除 pandas 数据帧行和列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46228221/