gpt4 book ai didi

Python数据帧: Dropping rows subject to multiple conditions

转载 作者:太空宇宙 更新时间:2023-11-03 14:37:33 24 4
gpt4 key购买 nike

假设我有以下(示例)数据框:

   a  b  c  d  e
0 9 9 0 9 9
1 1 2 1 9 9
2 8 8 0 2 3
3 7 7 0 7 8
4 1 2 0 3 4
5 6 2 3 6 6
6 1 2 0 1 2
7 1 3 0 1 2

还假设我生成了一个(任意)索引列表,例如[3,4]。对于列表中的每个元素,我想从数据框中删除“a”列和“b”列中具有与第 3 行和第 3 行相同值的所有行, 4.

由于第 3 行具有 a=7 和 b=7,并且没有其他行具有 a=7 和 b=7,因此仅删除第 3 行。

由于第 4 行有 a=1 和 b=2,并且第 1 行和第 6 行也有 a=1 和 b=2,因此我删除第 4、1 和 6 行。

因此生成的数据框将如下所示:

   a  b  c  d  e
0 9 9 0 9 9
1 8 8 0 2 3
2 6 2 3 6 6
3 1 3 0 1 2

有谁知道如何提出一个解决方案来快速做到这一点(用于更大的数据框架)?谢谢。

最佳答案

利用numpy broadcasting ;

  • 使用 loc 提取索引处的值并将其 reshape 为 3d 数组:

    df.loc[indices,cols].values[:,None]

  • 将其与列 a 进行比较和b ,由于维度不匹配和 numpy 广播,这会将第 3 行和第 4 行与所有其他行进行比较

    df[cols].values == df.loc[indices,cols].values[:,None]

  • 使用.all(2)确保两列匹配,并且 any(0)获取第 3 行或第 4 行的匹配

  • 否定 ~并删除匹配的行

给出:

indices = [3,4]
cols = ['a','b']
df[~(df[cols].values == df.loc[indices,cols].values[:,None]).all(2).any(0)]

# a b c d e
#0 9 9 0 9 9
#2 8 8 0 2 3
#5 6 2 3 6 6
#7 1 3 0 1 2

关于Python数据帧: Dropping rows subject to multiple conditions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46821785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com