python-3.x 为什么Pandas fillna方法不适用于pd.NA值?

toe95027  于 2023-03-04  发布在  Python
关注(0)|答案(1)|浏览(169)

根据reference page of Pandas.DataFrame.fillna,使用指定方法填充所有NA/NaN值。
但是,在存在pd.NA值的情况下,它不起作用。
正如你在下面的代码块中看到的,如果我想用列的模式替换丢失的布尔值(用pd.NA值标记),它是不起作用的:

import pandas as pd
import numpy as np

# create dataframe
df = pd.DataFrame({"a": [True, pd.NA, False, True], "b": [0, np.nan, 2, 3]})

# convert types (a becomes boolean, b becomes Int64)
df = df.convert_dtypes()

# get boolean columns
bool_cols = df.select_dtypes(include=bool).columns.tolist()

# get most frequent values
most_frequent_values = df[bool_cols].mode()

# replace missing content with column's mode
df[bool_cols] = df[bool_cols].fillna(most_frequent_values)

# print
print(df)

这是当前输出:
| 身份证|项目a|B|
| - ------|- ------|- ------|
| 无|真的|无|
| 1个|||
| 第二章|假|第二章|
| 三个|真的|三个|
虽然这是预期的输出:
| 身份证|项目a|B|
| - ------|- ------|- ------|
| 无|真的|无|
| 1个|真的||
| 第二章|假|第二章|
| 三个|真的|三个|
我错过了什么?我应该把所有的pd.na转换成NaNs吗?
旁注:我的Pandas版本是1.5.2

zour9fqk

zour9fqk1#

问题是mode不返回单个值,而是返回2D输出。
您需要更改:

most_frequent_values = df[bool_cols].mode().loc[0] # take the first mode

# then fillna
df[bool_cols] = df[bool_cols].fillna(most_frequent_values)

则输出正确:

a     b
0   True     0
1   True  <NA>
2  False     2
3   True     3

相关问题