熊猫 - FillNa与另一栏

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)

  • 真好!我不知道``fillna''需要一系列。 (4认同)
  • 谢谢!我认为该系列必须是 NA 值数量的精确大小。 (2认同)

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.


chr*_*ock 7

只需使用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)


Jer*_*y Z 6

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)