python - 根据其他行值填充 Pandas DataFrame NaN 值的最佳方法是什么?
问题描述
我有一个 DataFrame,在所有列中都有一些 NaN 值(总共 3 列)。我想用最快的方法用其他行中的最新有效值填充每个单元格中的 NaN 值。例如,如果 A 列是 NaN,B 列是“123”,我想在 B 列是“123”时在 A 列中找到最新值,并用该最新值填充 NaN 值。
我知道使用循环很容易做到这一点,但我正在考虑具有 2500 万条记录的 DataFrame 中的性能。任何想法都会有所帮助。
解决方案
此解决方案使用 for 循环,但它循环 A 的值为 NaN 的值。
A = The column containing NaNs
B = The column to be referenced
import pandas as pd
import numpy as np
#Consider this dataframe
df = pd.DataFrame({'A':[1,2,3,4,np.nan,6,7,8,np.nan,10],'B':['xxxx','b','xxxx','d','xxxx','f','yyyy','h','yyyy','j']})
A B
0 1.0 xxxx
1 2.0 b
2 3.0 xxxx
3 4.0 d
4 NaN xxxx
5 6.0 f
6 7.0 yyyy
7 8.0 h
8 NaN yyyy
9 10.0 j
for i in list(df.loc[np.isnan(df.A)].index): #looping over indexes where A in NaN
#dict with the keys as B and values as A
#here the dict keys will be unique and latest entries of B, hence having latest corresponding A values
dictionary = df.iloc[:i+1].dropna().set_index('B').to_dict()['A']
df.iloc[i,0] = dictionary[df.iloc[i,1]] #using the dict to change the value of A
这是执行代码后df的样子
A B
0 1.0 xxxx
1 2.0 b
2 3.0 xxxx
3 4.0 d
4 3.0 xxxx
5 6.0 f
6 7.0 yyyy
7 8.0 h
8 7.0 yyyy
9 10.0 j
请注意在 index = 4 时,A 的值如何更改为 3.0 而不是 1.0
推荐阅读
- xamarin.forms - FileNotFoundException:无法加载文件或程序集 Syncfusion.sfpopupayout.XForms
- php - 在 WooCommerce 存档页面上显示产品名称和星级评分之间的自定义字段
- sql - 垂直加入按列分组
- ajax - 如何在 laravel 中配置角色管理中间件
- python-3.x - 安装numba时如何解决错误?
- angular - 用于删除行的 ESLint Lint 缩进配置
- android - 视图绑定适用于一种布局,但不适用于另一种布局
- c# - 如何从 C# 中的 C++ dll 获取数组的内容
- docker - redis HMSEET 发生错误,拨打 tcp :6379: connect: connection denied
- mongodb - [MongoDB Ops Manager]mongo.mongoUri ops manager db hosts connection not working