【问题标题】:Dropping rows, where a dynamic number of integer columns only contain 0's删除行,其中动态数量的整数列仅包含 0
【发布时间】:2021-08-13 17:32:11
【问题描述】:

我有以下问题 - 我有以下示例数据框:

Name Planet Number Column #1 Number Column #2
John Earth 2 0
Peter Terra 0 0
Anna Mars 5 4
Robert Knowhere 0 1

在这里,我只想删除所有数字为 0 的行。在这种情况下,这是第二行。所以我的数据框必须变成这样:

Name Planet Number Column #1 Number Column #2
John Earth 2 0
Anna Mars 5 4
Robert Knowhere 0 1

为此,我有一个解决方案,如下:

 new_df = old_df.loc[(a['Number Column #1'] > 0) + (a['Number Column #2'] > 0)]

这行得通,但是我还有另一个问题。根据请求,我的数据框将动态具有不同数量的数字列。例如:

Name Planet Number Column #1 Number Column #2 Number Column #3
John Earth 2 0 1
Peter Terra 0 0 0
Anna Mars 5 4 2
Robert Knowhere 0 1 1

这是有问题的部分,因为我不确定如何调整我的代码以适用于动态列。我从 StackOverflow 和 Pandas 文档中尝试了多种方法 - 但是大多数示例仅适用于数据帧,其中所有列都是整数。 Pandas 是否会将它们视为布尔值,您可以添加一个简单的解决方案,如下所示:

 new_df = (df != 0).any(axis=1)

然而,在我的情况下,总是相同的文本列是有问题的。有人对这里的解决方案有想法吗?提前非常感谢!

附:我将代码中预先可用的数字列的名称作为列表,例如:

 my_num_columns = ["Number Column #1", "Number Column #2", "Number Column #3"]
 # my pandas logic...

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    IIUC:

    您可以通过select_dtypes() 尝试并选择 int 和 float 列,然后检查您的条件并过滤掉您的数据框:

    df=df.loc[~df.select_dtypes(['int','float']).eq(0).all(axis=1)]
    #OR
    df=df.loc[df.select_dtypes(['int','float']).ne(0).any(axis=1)]
    

    注意:如果需要,您还可以包含“bool”列并将其类型转换为浮动,然后检查您的条件:

    df=df.loc[df.select_dtypes(['int','float','bool']).astype(float).ne(0).any(axis=1)]
    

    【讨论】:

    • 非常感谢!有用。当时间限制到期时,我将接受作为答案。
    猜你喜欢
    • 2014-10-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多