最近在用 Pandas 处理数据的时候,遇到一个需要对某个 DataFrame 值,进行自增累加的操作,踩了一个 NaN 的坑,记录一下。
首先是创建一个空的 DataFrame,正常逻辑是要先赋值,然后再自增的,但是我为了偷懒,就没做判断,直接累加,这个地方肯定会报一个 KeyError,所以我捕获一个异常,命中的话就是第一次出现这个组合,直接赋值为1,后面再出现就累加了。
import pandas as pd df = pd.DataFrame() for l1 in ['a','b']: for l2 in ['a','c']: # 对df直接赋值会报错 try: df.loc[l1, l2] += 1 except KeyError: df.loc[l1,l2] = 1 print(df)
本以为这样就没问题了,但测试的时候发现,总有一些异常值。方便理解,我简化成了上面这个结构,df.loc['b', 'c'] 应该是1,但结果是NaN。
原因就是,当走完 a-b、a-c、b-a 之后,b-c的空间就已经被定义了,不过值是NaN,当程序运行到 try 结构的时候,df.loc['b', 'c'] 取到的就是NaN,而不会报错,所以 NaN+1 依然是NaN。
后面如果我们还有对NaN填充0的操作,那这个值就彻底错了。所以,在 try 里面还需要添加一个 NaN 的判断。
try: val = df.loc[l1, l2] if pd.isna(val): val = 0 df.loc[l1, l2] = val + 1 except KeyError: df.loc[l1,l2] = 1
本文为 陈华 原创,欢迎转载,但请注明出处:http://edu.ichenhua.cn/read/231
- 上一篇:
- 上海长宁图书馆周末自习打卡记录
- 下一篇:
- 手写AI算法之KNN近邻算法