【发布时间】:2018-12-26 03:01:45
【问题描述】:
我有一个大数据框(大约 800,000 行)。例如,将近 30% 的行具有 NaN 值,
test = pd.DataFrame({"name": [1,2,3,4,5,6,7],
"col1": ['c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7'],
"col2": [4, 5, 6, np.nan, np.nan, 8, 5],
"col3": [7, 8, 9, np.nan, np.nan, 3, 7],
"col4": [7, 8, 9, np.nan, np.nan, 2, 6]})
name col1 col2 col3 col4
0 1 c1 4.0 7.0 7.0
1 2 c2 5.0 8.0 8.0
2 3 c3 6.0 9.0 9.0
3 4 c4 NaN NaN NaN
4 5 c5 NaN NaN NaN
5 6 c6 8.0 3.0 2.0
6 7 c7 5.0 7.0 6.0
现在我在 row3 和 row4 中有 NaN。
根据一些规则,我得到的 row3 最相似的行是
similar_for_row3 = ['name' = 10, 'name' = 3, 'name' = 1]
对于第 4 行是
similar_for_row4 = ['name' = 2, 'name' = 6, 'name' = 20].
那么,我的问题是:
如何快速检查
similar_for_row3和similar_for_row4中的这些行是否在Dataframe 中,例如'name' = 10和'name' = 20不在其中。用相似行中的值快速替换一行中的
NaN值。例如row3,我们首先检查similar_for_row3中的所有行,然后使用Dataframe中存在的第一行(即test.loc[test['name' == 3]])替换row3中的NaN。
输出是:
name col1 col2 col3 col4
0 1 c1 4.0 7.0 7.0
1 2 c2 5.0 8.0 8.0
2 3 c3 6.0 9.0 9.0
3 4 c4 6.0 9.0 9.0 -> replace NaN with 'name' = 3
4 5 c5 NaN NaN NaN
5 6 c6 8.0 3.0 2.0
6 7 c7 5.0 7.0 6.0
我尝试使用“for 循环”迭代所有 Dataframe 以替换 NaN 值,但速度很慢。更换一排大约需要 3 秒。我的数据集有 800,000 行。我要花一个月的时间来做这件事。请帮忙!
【问题讨论】:
标签: python pandas dataframe nan