【发布时间】:2018-02-25 04:37:13
【问题描述】:
当我开始扩展我的数据分析时,我的数据帧中出现了 iterrows 的性能问题。
这是我正在使用的当前循环。
for ii, i in a.iterrows():
for ij, j in a.iterrows():
if ii != ij:
if i['DOCNO'][-5:] == j['DOCNO'][4:9]:
if i['RSLTN1'] > j['RSLTN1']:
dl.append(ij)
else:
dl.append(ii)
elif i['DOCNO'][-5:] == j['DOCNO'][-5:]:
if i['RSLTN1'] > j['RSLTN1']:
dl.append(ij)
else:
dl.append(ii)
c = a.drop(a.index[dl])
循环的重点是找到在数据帧中不同但已知是等价的“DOCNO”值,由 5 个等价但在字符串中间隔不同的字符表示。找到后,我想从关联的“RSLTN1”列中删除较小的数字。此外,我的数据集可能有多个条目,用于唯一的“DOCNO”,我想删除较低编号的“RSLTN1”结果。
我成功地运行了少量数据(约 1000 行),但当我扩大 10 倍时,我遇到了性能问题。有什么建议吗?
来自数据集的样本
In [107]:a[['DOCNO','RSLTN1']].sample(n=5)
Out[107]:
DOCNO RSLTN1
6815 MP00064958 72386.0
218 MP0059189A 65492.0
8262 MP00066187 96497.0
2999 MP00061663 43677.0
4913 MP00063387 42465.0
【问题讨论】:
-
我们需要找到一种矢量化的方法。双循环效率很低。
-
你能给我一个两个等效的 DOCNO 的小例子,应该删除。
-
索引 218 就是一个例子。 “DOCNO”中将有另一个条目,即 MP00059189。也有可能dataframe中会有MP0059189B、MP0059189C等。