熊猫 - FillNa与另一栏

时间:2015-05-20 18:08:34

标签: python pandas

我想用另一列的值填充一列中的缺失值。

我读到循环遍历每一行将是非常糟糕的做法,并且最好一次性完成所有事情,但我无法找到如何使用fillna方法。

之前的数据

Day  Cat1  Cat2
1    cat   mouse
2    dog   elephant
3    cat   giraf
4    NaN   ant

之后的数据
Day  Cat1  Cat2
1    cat   mouse
2    dog   elephant
3    cat   giraf
4    ant   ant

7 个答案:

答案 0 :(得分:104)

您可以将此列提供给fillna(请参阅docs),它将使用匹配索引上的这些值来填充:

In [17]: df['Cat1'].fillna(df['Cat2'])
Out[17]:
0    cat
1    dog
2    cat
3    ant
Name: Cat1, dtype: object

答案 1 :(得分:14)

你可以做到

df.Cat1 = np.where(df.Cat1.isnull(), df.Cat2, df.Cat1)

RHS上的整体结构使用the ternary pattern from the pandas cookbook(无论如何都需要付费)。它是a? b: c的矢量版本。

答案 2 :(得分:5)

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

答案 3 :(得分:1)

这是一种更通用的方法(fillna方法可能更好)

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)

答案 4 :(得分:1)

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

与其他答案比较:

%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)

我在下面没有使用此方法:

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)

因为它将引发异常:

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')

意味着np.isnan可以应用于本机dtype的NumPy数组(例如np.float64), 但应用于 object 数组时会引发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)

答案 5 :(得分:0)

repr(object)

您可以使用update方法来更新缺失的值

update

答案 6 :(得分:0)

我知道这是一个老问题,但是最近我需要做类似的事情。我可以使用以下内容:

df = pd.DataFrame([["1","cat","mouse"],
    ["2","dog","elephant"],
    ["3","cat","giraf"],
    ["4",np.nan,"ant"]],columns=["Day","Cat1","Cat2"])

print(df)

  Day Cat1      Cat2
0   1  cat     mouse
1   2  dog  elephant
2   3  cat     giraf
3   4  NaN       ant

df1 = df.bfill(axis=1).iloc[:, 1]
df1 = df1.to_frame()
print(df1)

哪种产量:

  Cat1
0  cat
1  dog
2  cat
3  ant

希望这对某人有帮助!