如何根据条件表达式从 pandas DataFrame 中删除行[重复]

2024-12-27 08:47:00
admin
原创
119
摘要:问题描述:我有一个 pandas DataFrame,我想从中删除特定列中字符串长度大于 2 的行。我希望能够做到这一点(根据这个答案):df[(len(df['column name']) < 2)] 但我刚刚收到错误:KeyError: u'no item named False' 我做错什么了?(...

问题描述:

我有一个 pandas DataFrame,我想从中删除特定列中字符串长度大于 2 的行。

我希望能够做到这一点(根据这个答案):

df[(len(df['column name']) < 2)]

但我刚刚收到错误:

KeyError: u'no item named False'

我做错什么了?

(注意:我知道我可以用来df.dropna()删除包含任何的行NaN,但是我没有看到如何根据条件表达式删除行。)


解决方案 1:

为了直接回答这个问题的原标题“如何根据条件表达式从 pandas DataFrame 中删除行”(我理解这不一定是 OP 的问题,但可以帮助遇到这个问题的其他用户)一种方法是使用 drop方法:

df = df.drop(some labels)
df = df.drop(df[<some boolean condition>].index)

例子

删除列“分数”小于 50 的所有行:

df = df.drop(df[df.score < 50].index)

就位版本(如评论中指出的那样)

df.drop(df[df.score < 50].index, inplace=True)

多个条件

(参见布尔索引)

运算符包括:|for or&forand~for not。必须使用括号对这些运算符进行分组。

删除列“分数”小于 50 且大于 20 的所有行

df = df.drop(df[(df.score < 50) & (df.score > 20)].index)

解决方案 2:

执行此操作时,len(df['column name'])您只会获得一个数字,即 DataFrame 中的行数(即列本身的长度)。如果要应用于len列中的每个元素,请使用df['column name'].map(len)。所以尝试

df[df['column name'].map(len) < 2]

解决方案 3:

您可以将 分配DataFrame给其自身的过滤版本:

df = df[df.score > 50]

这比以下更快drop

%%timeit
test = pd.DataFrame({'x': np.random.randn(int(1e6))})
test = test[test.x < 0]
# 54.5 ms ± 2.02 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit
test = pd.DataFrame({'x': np.random.randn(int(1e6))})
test.drop(test[test.x > 0].index, inplace=True)
# 201 ms ± 17.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit
test = pd.DataFrame({'x': np.random.randn(int(1e6))})
test = test.drop(test[test.x > 0].index)
# 194 ms ± 7.03 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

解决方案 4:

我将扩展@User的通用解决方案以提供drop免费替代方案。这是针对根据问题标题(而非 OP 的问题)来到这里的人的

假设你想删除所有具有负值的行。一个解决方案是:

df = df[(df > 0).all(axis=1)]

一步一步解释:--

让我们生成一个 5x5 的随机正态分布数据框

np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,5), columns=list('ABCDE'))
      A         B         C         D         E
0  1.764052  0.400157  0.978738  2.240893  1.867558
1 -0.977278  0.950088 -0.151357 -0.103219  0.410599
2  0.144044  1.454274  0.761038  0.121675  0.443863
3  0.333674  1.494079 -0.205158  0.313068 -0.854096
4 -2.552990  0.653619  0.864436 -0.742165  2.269755

让条件删除负数。满足条件的布尔 df:-

df > 0
      A     B      C      D      E
0   True  True   True   True   True
1  False  True  False  False   True
2   True  True   True   True   True
3   True  True  False   True  False
4  False  True   True  False   True

满足条件的所有行的布尔系列 注意,如果行中的任何元素不满足条件,则该行被标记为 false

(df > 0).all(axis=1)
0     True
1    False
2     True
3    False
4    False
dtype: bool

最后根据条件从数据框中筛选出行

df[(df > 0).all(axis=1)]
      A         B         C         D         E
0  1.764052  0.400157  0.978738  2.240893  1.867558
2  0.144044  1.454274  0.761038  0.121675  0.443863

您可以将其分配回 df 以实际删除上面完成的vs过滤

df = df[(df > 0).all(axis=1)]

这可以轻松扩展以过滤掉包含 NaN (非数字条目)的行:-

df = df[(~df.isnull()).all(axis=1)]

对于以下情况,也可以简化此操作:删除 E 列为负数的所有行

df = df[(df.E>0)]

最后,我想用一些分析统计数据来说明为什么@User的drop解决方案比基于原始列的过滤速度慢:-

%timeit df_new = df[(df.E>0)]
345 µs ± 10.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit dft.drop(dft[dft.E < 0].index, inplace=True)
890 µs ± 94.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

列基本上就是Series一个NumPy数组,可以无成本地对其进行索引。对于对底层内存组织如何影响执行速度感兴趣的人,这里有一个关于加快 Pandas 速度的很棒的链接:

解决方案 5:

在熊猫中,您可以根据str.len边界并使用布尔结果进行过滤。

df[df['column name'].str.len().lt(2)]

解决方案 6:

如果您想根据列值上的某些复杂条件删除数据框中的行,那么按照上面显示的方式编写可能会很复杂。我有以下更简单的解决方案,它总是有效的。让我们假设您想删除带有“标题”的列,因此首先将该列放入列表中。

text_data = df['name'].tolist()

现在对列表的每个元素应用一些函数并将其放入熊猫系列中:

text_length = pd.Series([func(t) for t in text_data])

就我而言,我只是想获取令牌的数量:

text_length = pd.Series([len(t.split()) for t in text_data])

现在在数据框中添加一个包含上述系列的额外列:

df = df.assign(text_length = text_length .values)

现在我们可以在新列上应用条件,例如:

df = df[df.text_length  >  10]
def pass_filter(df, label, length, pass_type):

    text_data = df[label].tolist()

    text_length = pd.Series([len(t.split()) for t in text_data])

    df = df.assign(text_length = text_length .values)

    if pass_type == 'high':
        df = df[df.text_length  >  length]

    if pass_type == 'low':
        df = df[df.text_length  <  length]

    df = df.drop(columns=['text_length'])

    return df
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用