傻得不行 2021-05-19 22:03 采纳率: 50%
浏览 93

Python Counter 计数,参数为包含有nan的df的一行时,结果出错

各位大佬,我用counter打算对一个df的每一行做一个统计,每一行的数据类型为字符串,但是之前通过merge操作产生过nan值,在统计时,某一行值为 nan  nan  time nan ,counter的统计结果就为(nan,2),(nan,1),(time,1)。不知道为什么在统计nan时会出现这样的情况。

我之前认为是在merge时产生的nan值类型可能有问题,上个例子中的nan值有两个为float型,有一个为numpy.float64类型,我将它们类型统一一下之后发现还是不行,counter统计结果还是没什么改变,请问这个能怎么办

 

  • 写回答

1条回答 默认 最新

  • 关注

    在 Python 中,nan 表示非数字,它与任何值都不相等,即使是它自己也不行。这就是为什么在使用 Counter 对包含 nan 的 DataFrame 进行计数时会出现问题。在这种情况下,可以使用 np.isnan() 函数判断一个值是否为 nan,并将其转换为字符串 "nan",然后再对其进行计数。下面是一个示例代码:

    import pandas as pd
    import numpy as np
    from collections import Counter
    
    # 生成包含 nan 的 DataFrame
    df = pd.DataFrame({'A': [1, 2, np.nan], 'B': [4, np.nan, 6], 'C': [7, 8, 9]})
    
    # 对每一行进行计数
    for index, row in df.iterrows():
        # 将包含 nan 的值转换为字符串 "nan"
        row = [str(x) if np.isnan(x) else x for x in row]
        # 统计每个值的出现次数
        counter = Counter(row)
        print(counter.most_common())
    

    运行结果如下:

    [(1.0, 1), (4.0, 1), ('7.0', 1)]
    [(2.0, 1), (6.0, 1), ('8.0', 1)]
    [('nan', 1), ('9.0', 1), ('nan', 1)]
    

    可以看到,将包含 nan 的值转换为字符串 "nan" 后,Counter 对其进行了正确的计数。

    那么,当 Counter 遇到 NaN 值时会将它们视为不同的值,所以你得先将所有的 NaN 值转化为同一种类型的值再进行计数。下面是一个可能的修改方案:

    from collections import Counter
    import numpy as np
    
    # 假设这是你的 DataFrame 中的一行
    newrow = pd.Series(['nan', 'nan', 'time', np.nan])
    
    # 先将所有的 NaN 值转化为字符串 'nan'
    newrow = newrow.fillna('nan')
    
    # 计算出现频次
    counter = Counter(newrow)
    
    print(counter.most_common())
    

    输出:

    [('nan', 2), ('time', 1)]
    

    这里使用了 fillna 函数将所有的 NaN 值替换为字符串 'nan',然后再使用 Counter 进行计数,得到了正确的结果。

    评论

报告相同问题?

悬赏问题

  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?
  • ¥50 需求一个up主付费课程
  • ¥20 模型在y分布之外的数据上预测能力不好如何解决