iTErrors的性能问题

2024-10-01 13:37:17 发布

您现在位置:Python中文网/ 问答频道 /正文

当我开始扩展我的数据分析时,我的数据帧中的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

Tags: 数据inforif数字性能elseii
1条回答
网友
1楼 · 发布于 2024-10-01 13:37:17

这个怎么适合你的需要?你知道吗

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

相关问题 更多 >