python - 根据值以批量方式删除 pandas 数据帧行和列

标签 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]

在这个例子中,这看起来有点多余,但请想象一下我有很多这样的数据点(比如 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/

相关文章:

python - 使用 PySerial 从串口读取二进制数据

python - 类型错误 : f0() takes 1 positional argument but 9 were given

python - 新的 Pandas 列,其累积值取决于前一行的条件

python - 如何将数据框转换为嵌套字典?

python - 作为 DataFrame 列的 Scipy 稀疏矩阵

python - Wand 将 pdf 转换为 jpeg 并将页面存储在类似文件的对象中

python - 如果脚本有时会锁定并永远运行,如何定期安排脚本

python - 添加与不带循环的 groupby 操作相关的元素编号列

python - pandas dataframe 根据索引/列名称应用函数

python - 多次重复将相同的两个数据帧相乘会在一些迭代后引发错误