最近在用 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://ichenhua.cn/read/231