[英]check on element in a row in a data frame in pandas is NaN then replace it
[英]Pandas data frame: replace nan with the mean of that row
假设我有以下数据框:
import numpy as np
import pandas as pd
df = pd.DataFrame({'A' : [np.nan, 1,2],
'B' : [3, np.nan, 4],
'C': [5,6,np.nan]}).T
>>df
0 1 2
A NaN 1 2
B 3 NaN 4
C 5 6 NaN
要更换np.nan
在该行的平均np.nan
发生后,我用了fillna方法如下:
fill_value = pd.DataFrame({col: df.mean(axis=1) for col in df.columns})
df.fillna(fill_value, inplace=True)
Yields:
0 1 2
A 1.5 1.0 2.0
B 3.0 3.5 4.0
C 5.0 6.0 5.5
我不确定为什么我无法获得填充方法来执行相同的操作:
mask = np.isnan(df)
masked_df = np.ma.masked_array(df, mask)
means = np.mean(masked_df, axis=0)
df = masked_df.filled(means)
Yields:
array([[ 4. , 1. , 2. ],
[ 3. , 3.5, 4. ],
[ 5. , 6. , 3. ]])
知道如何获取filled
方法来做同样的事情吗? 谢谢。
这是因为在填充的示例中,平均值计算是错误的(您使用axis = 0而不是1)。 如果我使用第一个示例中的fill_values
看起来不错,
import numpy as np
import pandas as pd
df = pd.DataFrame({'A' : [np.nan, 1,2],
'B' : [3, np.nan, 4],
'C': [5,6,np.nan]}).T
mask = np.isnan(df)
masked_df = np.ma.masked_array(df, mask)
fill_value = pd.DataFrame({col: df.mean(axis=1) for col in df.columns})
df = masked_df.filled(fill_value)
print(df)
输出:
[[ 1.5 1. 2. ]
[ 3. 3.5 4. ]
[ 5. 6. 5.5]]
在下面的工作中,您可以计算逐行均值,并将其作为替换NaN
值的值进行传递,您必须对均值进行转置以便正确执行对齐:
In [154]:
df.fillna(df.mean(axis=1).T, axis=0)
Out[154]:
0 1 2
A 1.5 1.0 2.0
B 3.0 3.5 4.0
C 5.0 6.0 5.5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.