【问题标题】:counting total rows in pandas dataframe with the same string value in multiple columns计算多列中具有相同字符串值的熊猫数据框中的总行数
【发布时间】:2017-09-15 00:08:37
【问题描述】:

非常感谢您的帮助!

问题:如何计算多列中包含“9999-不知道”的行数?

我已经找到了半途而废的解决方案。例如,我发现了许多示例,您可以使用列的名称来获取具有特定条件的行数。但是,我有 76 列,每列代表调查中的不同问题,因此具有不同的标签,因此效率非常低。

下面是一个示例 df。同样,请记住我有 76 列,因此使用列的名称不是一个可行的选择。

pd.DataFrame.from_items([('RespondentId', ['1ghi3g','335hduu','4vlsiu4','5nnvkkt','634deds','7kjng']), ('Satisfaction - Timing', ['9-Excellent','9-Excellent','9999-Don\'t Know','8-Very Good','1-Very Unsatisfied','9999-Don\'t Know']),('Response Speed - Time',['9999-Don\'t Know','9999-Don\'t Know','9-Excellent','9-Excellent','9-Excellent','9-Excellent'])])

如您所见,共有 4 行出现“9999-不知道”,所以我想得到输出 4。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这将为您提供等于每列“9999-不知道”的行数

    df.astype(object).eq("9999-Don't Know").sum()
    

    这将为您提供“9999-不知道”的总数,谢谢@Mitch

    df.astype(object).eq("9999-Don't Know").values.sum()
    

    这将为您提供至少有一个的总行数

    df.astype(object).eq("9999-Don't Know").any(1).sum()
    

    【讨论】:

    • 可能想要.values.sum()
    • 或 df.eq("9999-Don't Know").sum().sum() - 双倍总和
    • 我尝试了您的解决方案,但收到 TypeError:无法将 ["9999-Don't Know"] 与块值进行比较。这是否意味着此 Excel 文件中某些单元格的格式可能不一致? @米奇。我也收到了与您的解决方案相同的信息。
    • @AlexeyTrofimov 我尝试了您的解决方案并得到了相同的消息
    • 似乎数据框中的值不是字符串而是列表。首先尝试这个以检查它是否有效: df = df.applymap(lambda x: x[0] if type(x) == list else x)
    【解决方案2】:

    你也可以这样用:

    df.stack().str.contains("9999-Don't Know").sum()
    

    虽然这比@piRSquared 解决方案慢:

    In [38]: timeit df.astype(str).eq("9999-Don't Know").values.sum() 
    1000 loops, best of 3: 182 us per loop
    
    In [39]: timeit df.stack().str.contains("9999-Don't Know").sum()
    1000 loops, best of 3: 467 us per loop
    

    【讨论】:

    • 非常感谢!这正是我想要的。
    • @techscolasticus 欢迎您。但我建议您接受其他解决方案,因为它更快..
    • 我会,但它给了我一个错误,所以我无法获得总行数。
    【解决方案3】:

    另一种解决方案是:

    df.eq("9999-Don't Know").sum().sum()
    

    你也提到了类型错误:

    TypeError: Could not compare ["9999-Don't Know"] with block values. 
    

    这意味着你有一个类似于 DataFrame 元素的列表。可以用代码转换成字符串:

     df = df.applymap(lambda x: x[0] if type(x) == list else x) 
    

    【讨论】:

    • so df=df.applymap... 确实有效,但我不确定在那之后我应该做什么才能获得总行数
    • 之后,您可以使用此处提出的任何解决方案。例如。 df.eq("9999-不知道").sum().sum()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    相关资源
    最近更新 更多