【问题标题】:Performance issues with pandas iterrowspandas iterrows 的性能问题
【发布时间】: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等。

标签: python pandas


【解决方案1】:

这如何满足您的需求?

import pandas as pd

s = '''\
DOCNO   RSLTN1
MP00059189  72386.0
MP0059189A  65492.0
MP00066187  96497.0
MP00061663  43677.0
MP00063387  42465.0'''

# Recreate dataframe
df = pd.read_csv(pd.compat.StringIO(s), sep='\s+')

# Create mask 
# We sort to make sure we keep only highest value
# Remove all non-digit according to: https://stackoverflow.com/questions/44117326/
m = (df.sort_values(by='RSLTN1',ascending=False)['DOCNO']
       .str.extract('(\d+)', expand=False)
       .astype(int).duplicated())

# Apply inverted `~` mask 
df = df.loc[~m]

结果df:

        DOCNO   RSLTN1
0  MP00059189  72386.0
2  MP00066187  96497.0
3  MP00061663  43677.0
4  MP00063387  42465.0

在此示例中,删除了以下行:

MP0059189A  65492.0

【讨论】:

  • 不是 100% 确定,但似乎 pd.compat.StringIO 应该在 python2/python3 中工作。但永远不要测试它;)
  • @jezrael 当然我会使用它,但我认为 io.StringIO 与 py2 兼容
  • @DougGuyer 你想进一步解释吗?我很乐意为熊猫用户提供帮助
  • @AntonvBR 您更新的答案增加了我需要的清晰度。谢谢
猜你喜欢
  • 2014-09-12
  • 1970-01-01
  • 2014-04-14
  • 2022-12-11
  • 2017-07-16
  • 2019-04-14
  • 1970-01-01
  • 2016-11-20
  • 2022-12-22
相关资源
最近更新 更多