为了账号安全,请及时绑定邮箱和手机立即绑定

在这种情况下,除了循环之外,pandas 中是否有任何更简单的方法来替换空值?

在这种情况下,除了循环之外,pandas 中是否有任何更简单的方法来替换空值?

ABOUTYOU 2022-06-28 10:11:30
我正在尝试用每个组(分组区域)中的数字模式替换空值。Pandas 中有没有更简单的方法可以做到这一点?我已经通过循环方法完成了它,不推荐用于非常大的数据集。data = {'area':['abc', 'abc', 'abc', 'abc','bcd', 'bcd', 'bcd' , 'cde','cde', 'cde', 'cde', 'cde'], 'number':[1, 2, 2, np.nan, 3, 3, np.nan, 5, 5, 4, np.nan, np.nan]}df = pd.DataFrame(data)Hell = pd.DataFrame(df.groupby("area")['number'].agg(lambda x:x.value_counts().index[0])).reset_index()import mathfor index in range(0,df.shape[0]):       if math.isnan(df['number'][index]):        for i in range(0,Hell.shape[0]):            if Hell['area'][i] == df['area'][index]:                df['number'][index] = Hell['number'][i]
查看完整描述

1 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

使用Series.fillnawithSeries.map替换匹配值 by area:


df['number'] = df['number'].fillna(df['area'].map(Hell.set_index('area')['number']))

print (df)

   area  number

0   abc     1.0

1   abc     2.0

2   abc     2.0

3   abc     2.0

4   bcd     3.0

5   bcd     3.0

6   bcd     3.0

7   cde     5.0

8   cde     5.0

9   cde     4.0

10  cde     5.0

11  cde     5.0

或者将您的解决方案GroupBy.transform用于相同的系列,例如由聚合值填充的原始系列:


s = df.groupby("area")['number'].transform(lambda x: x.value_counts().index[0])

#alternative

#s = df.groupby("area")['number'].transform(lambda x: x.mode().iat[0])

df['number'] = df['number'].fillna(s)

print (df)

   area  number

0   abc     1.0

1   abc     2.0

2   abc     2.0

3   abc     2.0

4   bcd     3.0

5   bcd     3.0

6   bcd     3.0

7   cde     5.0

8   cde     5.0

9   cde     4.0

10  cde     5.0

11  cde     5.0


查看完整回答
反对 回复 2022-06-28
  • 1 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信