pandas iterrows的性能问题

时间:2018-02-24 20:09:36

标签: python pandas

当我开始扩展数据分析时,我的数据框中存在性能问题。

这是我正在使用的当前循环。

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

1 个答案:

答案 0 :(得分:2)

这如何适合您的需要?

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