pandasread_excel之间的na_values和转换器错误的干扰?

当使用Pandas read_excel函数时,我发现了一些奇怪的行为。 我有一个电子表格的人为的例子,看起来像:

Name age weight Bob 35 70 Alice 15 ... Sam ... 65 Susan 92 63 Harold 42 ... 

缺less的值用'…'表示,我希望他们读作NaN。 我也想把重量换算成克。 我的第一个尝试是:

 df=pd.read_excel('test.xls',na_values='...',converters={'weight':lambda y:y*1000}) 

不幸的是,这首先应用了转换器function,所以Susan和Harold的缺失重量不是三个点,而是三千个点,与给定的“na_value”条目不匹配,因此不会变成NaN。 这是非常意外的。

这是否是这个function的最佳行为的原因?

在执行它的时候,我做了什么明显的错误吗?

得到我想要的行为的最好方法是什么?

converters在应用na_values之前运行,这就是您看到这种行为的原因。
只需在你的转换器中添加一个条件来捕获... weights实例 – 就像添加一个手卷na_values

 df = pd.read_excel("test.xls", na_values="...", converters={"weight":lambda w: w*1000 if isinstance(w, int) else None}) print(df) Name age weight 0 Bob 35.0 70000.0 1 Alice 15.0 NaN 2 Sam NaN 65000.0 3 Susan 92.0 63000.0 4 Harold 42.0 NaN 

保持实际的na_values参数,以确保age字段中的值也被转换。

我会这样做:

 df = pd.read_excel('test.xls', na_values='...') \ .eval("weight = weight * 1000", inplace=False) 

在这种情况下,我不认为你需要使用转换器参数。 在read_excel之后执行该操作。 我甚至相信有更好的performance。

喜欢这个:

 df=pd.read_excel('test.xls', .... df['weight'] *= 1000