使用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。这是非常意外的。
这是否是此功能的最佳行为?
我在执行它时是否做了明显错误的事情?
获得我想要的行为的最佳途径是什么?
答案 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