为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的 pandas 代码会引发分配警告并运行缓慢?

为什么我的 pandas 代码会引发分配警告并运行缓慢?

慕姐4208626 2022-09-06 18:08:41
我正在做一个项目,我必须处理很多诊断。无论目的是什么,在编码方面,我认为下面的代码是正确的,但是它需要花费很多时间(〜1小时),并且它总是向我显示警告。有什么是我做对了吗?提前感谢您# The first 3 values are the only that mattersdiagnoses_sec = df[['Diagnóstico 2', 'Diagnóstico 3', 'Diagnóstico 4', 'Diagnóstico 5', 'Diagnóstico 6',          'Diagnóstico 7', 'Diagnóstico 8', 'Diagnóstico 9', 'Diagnóstico 10', 'Diagnóstico 11', 'Diagnóstico 12',           'Diagnóstico 13', 'Diagnóstico 14', 'Diagnóstico 15', 'Diagnóstico 16', 'Diagnóstico 17', 'Diagnóstico 18',           'Diagnóstico 19', 'Diagnóstico 20']]for i in range(0, diagnoses_sec.shape[1]):    diagnoses_sec.iloc[:,i].fillna("ZZZ", inplace = True)    diagnoses_sec.iloc[:,i] = diagnoses_sec.iloc[:,i].str.slice(start=0, stop=3, step=1)在这一部分中,有一个警告,但我不明白为什么:C:\Users\Asus\Anaconda3\lib\site-packages\pandas\core\indexing.py:630: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.Try using .loc[row_indexer,col_indexer] = value insteadSee the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy  self.obj[item_labels[indexer[info_axis]]] = value代码的第二部分是:from bisect import bisect_leftdiag_icd10_ranges = ["B99","D49","D89","E89","F99","G99","H59","H95",          "I99","J99","K95", "L99", "M99", "N99","O9A","P96","Q99",          "R99","T88","Y99","Z99","ZZZ"]
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

您将收到这些警告消息,就像 的一部分的副本一样。在此副本上设置值会引发警告,以确保您意识到这一点 - 您的更改不会传播回 。如果您使用 copy 方法显式创建副本,这些警告将消失,例如:SettingWithCopyWarningdiagnoses_secdfdf


diagnoses_sec = df[['Diagnóstico 2', 'Diagnóstico 3']].copy()

关于执行代码所需的时间,以这种方式迭代pandas是低效的,你应该努力使用矢量化操作,将函数或操作应用于整个数组。DataFrame


您可以修改第一个示例以执行此操作:


diagnoses_sec = df[['Diagnóstico 2', 'Diagnóstico 3', 'Diagnóstico 4', 'Diagnóstico 5', 'Diagnóstico 6',

          'Diagnóstico 7', 'Diagnóstico 8', 'Diagnóstico 9', 'Diagnóstico 10', 'Diagnóstico 11', 'Diagnóstico 12', 

          'Diagnóstico 13', 'Diagnóstico 14', 'Diagnóstico 15', 'Diagnóstico 16', 'Diagnóstico 17', 'Diagnóstico 18', 

          'Diagnóstico 19', 'Diagnóstico 20']].copy()

diagnoses_sec.fillna("ZZZ", inplace=True)

diagnoses_sec = diagnoses_sec.apply(lambda x: x.str.slice(start=0, stop=3, step=1))

此处,应用于整个,并将每个值替换为 。在第二个操作中,apply 将通过函数对 .fillnaDataFrameNA"ZZZ"lambdaSeriesdiagnoses_secDataFrame


您的第二种情况与此类似,但是由于您的函数未矢量化(它不对 or )进行操作,并且正在应用于您的每个单元格,因此您可以使用 applymap 对每个值执行它:icdGroupDataFrameSeriesDataFrame


diagnoses_sec = diagnoses_sec.applymap(icdGroup)


查看完整回答
反对 回复 2022-09-06
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信