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.1df.fillna(df['default'].values)
引发异常ValueError:a
无效填充值。