熊猫read_excel na_values和转换器之间的干扰bug?

时间:2017-05-13 05:26:42

标签: python excel pandas

使用Pandas read_excel函数时,我发现了一些奇怪的行为。我有一个设计的电子表格示例,如下所示:

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

缺少的值由' ...'表示。我希望他们读作NaN。我还想将权重转换为克。我的第一次尝试是:

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

不幸的是,这首先应用转换器功能,因此Susan和Harold缺少的重量不会变成三个点而是三个点,这与给定的" na_value"因此不会变成NaN。这是非常意外的。

这是否是此功能的最佳行为?

我在执行它时是否做了明显错误的事情?

获得我想要的行为的最佳途径是什么?

3 个答案:

答案 0 :(得分:4)

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值也被转换。

答案 1 :(得分:0)

我这样做:

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

答案 2 :(得分:0)

在这种情况下,我认为你不需要使用converter参数。 在read_excel之后进行该操作。 我甚至认为它有更好的表现。

像这样:

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