xav*_*xav 70 python pandas fillna
我想用另一列的值填充一列中的缺失值.
我读到循环遍历每一行将是非常糟糕的练习,并且最好一次性完成所有操作,但我无法找到如何使用该fillna
方法.
数据之前
Day Cat1 Cat2
1 cat mouse
2 dog elephant
3 cat giraf
4 NaN ant
Run Code Online (Sandbox Code Playgroud)
数据之后
Day Cat1 Cat2
1 cat mouse
2 dog elephant
3 cat giraf
4 ant ant
Run Code Online (Sandbox Code Playgroud)
jor*_*ris 137
您可以提供此列fillna
(请参阅文档),它将使用匹配索引上的这些值来填充:
In [17]: df['Cat1'].fillna(df['Cat2'])
Out[17]:
0 cat
1 dog
2 cat
3 ant
Name: Cat1, dtype: object
Run Code Online (Sandbox Code Playgroud)
Ami*_*ory 15
你可以做到
df.Cat1 = np.where(df.Cat1.isnull(), df.Cat2, df.Cat1)
Run Code Online (Sandbox Code Playgroud)
RHS上的整体结构使用了pandas
食谱中的三元模式(无论如何都要付费阅读).这是一个矢量版本a? b: c
.
只需使用value
参数而不是method
:
In [20]: df
Out[20]:
Cat1 Cat2 Day
0 cat mouse 1
1 dog elephant 2
2 cat giraf 3
3 NaN ant 4
In [21]: df.Cat1 = df.Cat1.fillna(value=df.Cat2)
In [22]: df
Out[22]:
Cat1 Cat2 Day
0 cat mouse 1
1 dog elephant 2
2 cat giraf 3
3 ant ant 4
Run Code Online (Sandbox Code Playgroud)
pandas.DataFrame.combine_first也可以。
(注意:由于“结果索引列将是各个索引和列的并集”,因此应检查索引和列是否匹配。)
import numpy as np
import pandas as pd
df = pd.DataFrame([["1","cat","mouse"],
["2","dog","elephant"],
["3","cat","giraf"],
["4",np.nan,"ant"]],columns=["Day","Cat1","Cat2"])
In: df["Cat1"].combine_first(df["Cat2"])
Out:
0 cat
1 dog
2 cat
3 ant
Name: Cat1, dtype: object
Run Code Online (Sandbox Code Playgroud)
与其他答案比较:
%timeit df["Cat1"].combine_first(df["Cat2"])
181 µs ± 11.3 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit df['Cat1'].fillna(df['Cat2'])
253 µs ± 10.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit np.where(df.Cat1.isnull(), df.Cat2, df.Cat1)
88.1 µs ± 793 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Run Code Online (Sandbox Code Playgroud)
我没有在下面使用此方法:
def is_missing(Cat1,Cat2):
if np.isnan(Cat1):
return Cat2
else:
return Cat1
df['Cat1'] = df.apply(lambda x: is_missing(x['Cat1'],x['Cat2']),axis=1)
Run Code Online (Sandbox Code Playgroud)
因为它将引发一个异常:
TypeError: ("ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''", 'occurred at index 0')
Run Code Online (Sandbox Code Playgroud)
这意味着np.isnan可以应用于本机dtype的NumPy数组(例如np.float64),但是在应用于对象数组时会引发TypeError 。
所以我修改了方法:
def is_missing(Cat1,Cat2):
if pd.isnull(Cat1):
return Cat2
else:
return Cat1
%timeit df.apply(lambda x: is_missing(x['Cat1'],x['Cat2']),axis=1)
701 µs ± 7.38 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
51047 次 |
最近记录: |