Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.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 基于默认值列替换多列中的NAN的最有效方法是什么?_Python_Pandas - Fatal编程技术网

Python 基于默认值列替换多列中的NAN的最有效方法是什么?

Python 基于默认值列替换多列中的NAN的最有效方法是什么?,python,pandas,Python,Pandas,我有一个像 import pandas as pd import numpy as np df = pd.DataFrame( { 'val1': [1,np.nan,3], 'val2': [np.nan,5,6], 'val3': [7,np.nan,8], 'default': [ 42,43,44 ] } ) i、 e 我希望将每个NaN替换为“default”列中相应行中给出的默认值 我可以使用DataFrame.fillna在for循环中按列执行 for col in [ 'va

我有一个像

import pandas as pd
import numpy as np

df = pd.DataFrame( { 'val1': [1,np.nan,3], 'val2': [np.nan,5,6], 'val3': [7,np.nan,8], 'default': [ 42,43,44 ] } )
i、 e

我希望将每个NaN替换为“default”列中相应行中给出的默认值

我可以使用DataFrame.fillna在for循环中按列执行

for col in [ 'val1', 'val2' ]:
    df[ col ] = df[ col ].fillna( df['default'] )
这会产生期望的结果

   default  val1  val2  val3
0       42     1    42     7
1       43    43     5    43
2       44     3     6     8

我想知道是否有一个非for循环,可能是一个更有效的解决方案?我的数据框可能包含数百列和数万行。

请确保使用双括号表示
df[['default']]]
是一个数据框而不是一个系列,否则结果将与预期输出不匹配

>>> df.fillna(df[['default']].values)
   default  val1  val2  val3
0       42     1    42     7
1       43    43     5    43
2       44     3     6     8
在pandas 16.1+中,您需要为每个列传递一个序列,该序列可以使用字典理解构建

defaults = df['default']
>>> df.fillna({col: defaults for col in df})
   default  val1  val2  val3
0       42     1    42     7
1       43    43     5    43
2       44     3     6     8

请确保使用双括号表示
df[['default']]
是数据帧而不是序列,否则结果将与预期输出不匹配

>>> df.fillna(df[['default']].values)
   default  val1  val2  val3
0       42     1    42     7
1       43    43     5    43
2       44     3     6     8
在pandas 16.1+中,您需要为每个列传递一个序列,该序列可以使用字典理解构建

defaults = df['default']
>>> df.fillna({col: defaults for col in df})
   default  val1  val2  val3
0       42     1    42     7
1       43    43     5    43
2       44     3     6     8

因为在pandas版本0.16.1中,我无法将numpy.ndarray传递给DataFrame.fillna()

相反,我可以将数据帧传递给df.fillna()。文档中说,这个数据框指定了每列的值。因此,我必须转置df,填充na,然后转置回来

df.T.fillna(df['default']).T

因此,它甚至更短。但是它也是最有效的吗?

因为在pandas版本0.16.1中,我无法将numpy.ndarray传递给DataFrame.fillna()(请参阅我对Alexander答案的评论)

相反,我可以将数据帧传递给df.fillna()。文档中说,这个数据框指定了每列的值。因此,我必须转置df,填充na,然后转置回来

df.T.fillna(df['default']).T

因此,它甚至更短。但是它也是最有效的吗?

使用pandas版本0.16.1
df.fillna(df['default']].values)
引发异常
ValueError:a
无效填充值。使用pandas版本0.16.1
df.fillna(df['default'].values)
引发异常
ValueError:a
无效填充值。