Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将另一整列作为参数传递给_Python_Pandas_Fillna - Fatal编程技术网

Python 如何将另一整列作为参数传递给

Python 如何将另一整列作为参数传递给,python,pandas,fillna,Python,Pandas,Fillna,我想使用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

我想使用
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
你可以

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

RHS上的整体结构使用(在任何情况下阅读都需要付费)。这是一个向量版本的
a?b:c

只需使用
参数而不是
方法

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

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

同样有效

注意:由于“结果索引列将是各自索引和列的并集”,因此应检查索引和列是否匹配。

与其他答案相比:

%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可以应用于本机数据类型的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)

我知道这是一个老问题,但我最近也需要做类似的事情。我能够使用以下工具:

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

希望这对别人有帮助

很好!我不知道fillna需要一个系列。谢谢!我认为序列必须是NA值的精确大小。它也适用于多列行的数据帧。fillna的这一特性非常有用。我必须说我喜欢它!不是我用来解决这个问题的方法,而是非常有趣的模式!谢谢有没有一种方法可以用于多列?e、 g.如果该df有cat1、cat2、cat3、cat4、cat5,假设cat5为空。如果cat1为空,然后是cat2,如果cat2为空,然后是cat3等,有没有办法用cat1中的值填充cat5?@user832222我肯定迟到了,但是如果有人有这个问题,你可以做嵌套的np.where,就像你在excel cell=np.where中做的那样(cond,val\u true,np.where(cond,val\u true,val\u false),)。您想提到的是,这只是重新定义pandas内置的
pd.DataFrame.fillna()
。我怀疑角落案例的行为可能不同,例如,对于不同数据帧的不匹配序列长度:dfA['Cat1',dfB['Cat2'],谢谢您的回答!使用value而不是joris描述的方法会改变什么?@xav
value
是第一个参数,因此joris实际上也在做同样的事情。正如他所说的,请参见。是的,docstring有点误导,因为这里首先列出了
方法。
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