【问题标题】:Find the missing values in data frame using python使用python查找数据框中的缺失值
【发布时间】:2019-09-16 20:07:56
【问题描述】:
     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

【问题讨论】:

标签: python pandas numpy missing-data data-processing


【解决方案1】:

这里是单向:

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'到np.Nan,我们可以使用fillna。

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

【讨论】:

  • 如果你能解释一下这个过程会很有帮助
  • 太优雅了!
【解决方案2】:

首先你可能需要:

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

【讨论】:

  • :) 棘手的问题嗯?
猜你喜欢
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
相关资源
最近更新 更多