python - 在这种情况下,除了循环之外,pandas 中是否有任何更简单的方法来替换空值?
问题描述
我正在尝试用每个组(分组区域)中的数字模式替换空值。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 math
for 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]
解决方案
使用Series.fillna
withSeries.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
推荐阅读
- google-apps-script - 无法终止函数(> 500 000 次执行)
- docker - 在使用 Hyperledger Composer 构建的 Hyperledger Fabric 网络上配置 Kafka 排序服务
- ios - 线程 1:在 TableView Swift 上重新加载数据时,在 AppDelegate 上发出 SIGABRT 信号
- jquery - 是否有在模态表单准备好的事件上触发?我需要在那里设置下拉列表索引
- python - 在 python 3 中使用 win32api/com 模块时,有没有办法解决 unicode 问题?
- python - 是否可以提取嵌入在电子邮件正文中的 SSRS 报告并导出到 csv?
- keras - 根据 Keras TensorBoard 回调,CuDNNLSTM 的零梯度
- c# - 尝试从 c# 中的第四列读取数据 - unity
- php - 将 Wordpress 中的下拉列表或文本字段中的值传递给 functions.php 中的 MySQL 查询
- python - 将 Seaborn 轴转换为对数