使用 python 在数据框中查找缺失值

Find the missing values in data frame using python

     A1   A2  A3   B1   B2   B3
aa  1.0  4.0   9  NaN  NaN  2.0
bb  NaN  NaN   9  9.0  2.0  2.0
cc  3.0  2.0   7  1.0  3.0  2.0
dd  4.0  5.0   7  NaN  4.0  5.0
ee  5.0  NaN   1  5.0  1.0  5.0
ff  3.0  5.0   2  5.0  2.0  NaN

我需要根据以下参数填充缺失值(Na):

  1. 如果行 (aa, bb, cc, dd, ff) 的任何一列 (A1, A2, A3 或 B1, B2, B3) 有缺失值,则填充缺失值值与其他两行的值的平均值(A1-3 或 B1-3) 例如:(dd:B1) 应该是 (5+4)/2 = 4.5

  2. 如果行有两个缺失值属于(A1-A3 或 B1-B3),则用类别(A 或 B)第三列中的可用值填充它 示例:(bb:A1 and bb: A2) == 9 as (bb: A3 is 9)


预期输出:

     A1   A2   A3   B1   B2   B3
aa  1.0  4.0  9.0  2.0  2.0  2.0
bb  9.0  9.0  9.0  9.0  2.0  2.0
cc  3.0  2.0  7.0  1.0  3.0  2.0
dd  4.0  5.0  7.0  4.5  4.0  5.0
ee  5.0  3.0  1.0  5.0  1.0  5.0
ff  3.0  5.0  2.0  5.0  2.0  3.5

这里是one-way:

df.replace({'Na':np.nan}).T\
  .groupby(df.columns.str[0], group_keys=False)\
  .apply(lambda x: x.fillna(x.mean())).T

输出:

     A1   A2   A3   B1   B2   B3
aa  1.0  4.0  9.0  2.0  2.0  2.0
bb  9.0  9.0  9.0  9.0  2.0  2.0
cc  3.0  2.0  7.0  1.0  3.0  2.0
dd  4.0  5.0  7.0  4.5  4.0  5.0
ee  5.0  3.0  1.0  5.0  1.0  5.0
ff  3.0  5.0  2.0  5.0  2.0  3.5

详情:

首先,在原始数据框中,有字符串 'Na' 而不是 np.nan。用字典替换'Na' ton np.Nan,我们可以用fillna.

转置数据框,使列变为行,行变为列,这更容易,并且您可以通过对行而不是列进行分组来获得更多功能。使用列的第一个字母 header 通过使用 .str 访问器和切片位置 0 进行分组。接下来,我们可以将 fillna a 与 x 值的平均值一起使用。

首先你可能需要:

df=df.replace({'Na':np.nan})

现在 df 是:

     A1   A2  A3   B1   B2   B3
aa  1.0  4.0   9  NaN  NaN  2.0
bb  NaN  NaN   9  9.0  2.0  2.0
cc  3.0  2.0   7  1.0  3.0  2.0
dd  4.0  5.0   7  NaN  4.0  5.0
ee  5.0  NaN   1  5.0  1.0  5.0
ff  3.0  5.0   2  5.0  2.0  NaN

那么你可以使用:

c=df.columns.str.contains('A')
df2=df.T.groupby(c).mean().T
df2.columns=['B','A']
df=pd.concat([df.T[c].fillna(df2['A']),df.T[~c].fillna(df2['B'])]).T
print(df)


     A1   A2   A3   B1   B2   B3
aa  1.0  4.0  9.0  2.0  2.0  2.0
bb  9.0  9.0  9.0  9.0  2.0  2.0
cc  3.0  2.0  7.0  1.0  3.0  2.0
dd  4.0  5.0  7.0  4.5  4.0  5.0
ee  5.0  3.0  1.0  5.0  1.0  5.0
ff  3.0  5.0  2.0  5.0  2.0  3.5