
[英]pandas:numeric columns fillna with mean and character columns fillna with mode
[英]Pandas: fillna only numeric (int or float) columns
我只想在数字列中应用fillna
。 有可能吗?
现在,我正在所有列中应用它:
df = df.replace(r"^\\s*$", np.nan, regex=True)
您可以选择数字列,然后填充例如:
import pandas as pd
df = pd.DataFrame({'a': [1, None] * 3,
'b': [True, None] * 3,
'c': [1.0, None] * 3})
# select numeric columns
numeric_columns = df.select_dtypes(include=['number']).columns
# fill -1 to all NaN
df[numeric_columns] = df[numeric_columns].fillna(-1)
# print
print(df)
这是一个老问题,但是,我发现单独填充列比当前选择的答案更快:
def func(df, value):
df = df.copy()
for col in df:
# select only integer or float dtypes
if df[col].dtype in ("int", "float"):
df[col] = df[col].fillna(value)
return df
func(df, value=-1) # or df.pipe(func, value=-1)
a b c
0 1.0 True 1.0
1 -1.0 None -1.0
2 1.0 True 1.0
3 -1.0 None -1.0
4 1.0 True 1.0
5 -1.0 None -1.0
比较速度, loop
470 µs ± 12.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
loop
返回470 µs ± 12.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
,而接受的答案1.57 ms ± 26.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
返回1.57 ms ± 26.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
。
如果数据帧大小增加到 60,000 行: pd.concat([df]*10_000, ignore_index=True)
, loop
返回1.48 ms ± 79.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
而所选答案2.47 ms ± 140 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
返回2.47 ms ± 140 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
。
对于这两种情况,循环明显快于所选答案。 此外,您的里程可能会有所不同。 只是一些思考的食物,尤其是在试图榨取更多性能时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.