如何传递另一个整列作为参数熊猫填充()

我希望使用 fillna方法,用来自另一列的值来填充一列中缺少的值。

(我读到,循环遍历每一行将是非常糟糕的做法,最好是一次性完成所有事情,但我不知道如何使用 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
113290 次浏览

你可以的

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

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

您可以将这个列提供给 fillna(参见 医生) ,它将在匹配索引时使用这些值来填充:

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

这里有一个更通用的方法(fulna 方法可能更好)

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)

组合 _ 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 (比如 np.float64)的 NumPy 数组, 但在应用于 对象数组时引发 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)

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

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

希望这对某些人有帮助!

或者你也可以使用 mask:

In [8]: df.assign(Cat1=df['Cat1'].mask(df['Cat1'].isna(), df['Cat2']))
Out[8]:
Day Cat1      Cat2
0    1  cat     mouse
1    2  dog  elephant
2    3  cat     giraf
3    4  ant       ant