python - 在大型数据框中修改值的最有效方法 - Python
问题描述
概述:我正在使用人口普查信息的熊猫数据框,虽然它们只有两列,但它们有几十万行的长度。一列是人口普查块 ID 编号,另一列是“地点”值,该值对于该人口普查块 ID 所在的城市是唯一的。
示例数据:
BLOCKID PLACEFP
0 60014001001000 53000
1 60014001001001 53000
...
5844 60014099004021 53000
5845 60014100001000
5846 60014100001001
5847 60014100001002 53000
问题:如上所示,有几个地方值是空白的,尽管它们在相应的行中有一个人口普查块 ID。我发现在某些情况下,缺少位置值的人口普查块 ID 与没有缺少位置值的周围块位于同一城市内,尤其是在书挡位置值相同的情况下 - 如如上所示,索引为 5844 到 5847 - 这两个街区与周围街区位于相同的一般区域内,但似乎缺少位置值。
目标:我希望能够通过这个数据框,找到这些实例并根据缺失值之前的位置值和紧随其后的位置值填充缺失的位置值。
当前状态和障碍:我编写了一个遍历数据框的循环来纠正这些问题,如下所示。
current_state_blockid_df = pandas.DataFrame({'BLOCKID':[60014099004021,60014100001000,60014100001001,60014100001002,60014301012019,60014301013000,60014301013001,60014301013002,60014301013003,60014301013004,60014301013005,60014301013006],
'PLACEFP': [53000,,,53000,11964,'','','','','','',11964]})
for i in current_state_blockid_df.index:
if current_state_blockid_df.loc[i, 'PLACEFP'] == '':
#Get value before blank
prior_place_fp = current_state_blockid_df.loc[i - 1, 'PLACEFP']
next_place_fp = ''
_n = 1
# Find the end of the blank section
while next_place_fp == '':
next_place_fp = current_state_blockid_df.loc[i + _n, 'PLACEFP']
if next_place_fp == '':
_n += 1
# if the blanks could likely be in the same city, assign them the city's place value
if prior_place_fp == next_place_fp:
for _i in range(1, _n):
current_state_blockid_df.loc[_i, 'PLACEFP'] = prior_place_fp
但是,正如预期的那样,在处理数十万或多行数据时,它的速度非常慢。我考虑过使用 ThreadPool 执行程序来拆分工作,但我还没有完全弄清楚我用来完成这项工作的逻辑。稍微加快速度的一种可能性是取消检查以查看间隙的末端在哪里,而只需用空白之前的先前位置值填充它。虽然这可能最终成为我的 goto,但仍有可能它太慢了,理想情况下,我希望它仅在前后值匹配时才填写,从而消除错误分配块的可能性。如果有人对如何快速实现这一点有其他建议,将不胜感激。
解决方案
您可以使用它shift
来帮助加快该过程。但是,这并不能解决连续有多个空格的情况。
df['PLACEFP_PRIOR'] = df['PLACEFP'].shift(1)
df['PLACEFP_SUBS'] = df['PLACEFP'].shift(-1)
criteria1 = df['PLACEFP'].isnull()
criteria2 = df['PLACEFP_PRIOR'] == df['PLACEFP_AFTER']
df.loc[criteria1 & criteria2, 'PLACEFP'] = df.loc[criteria1 & criteria2, 'PLACEFP_PRIOR']
如果您最终需要遍历数据框,请使用df.itertuples
. row.column_name
您可以通过点符号 ( )访问行中的列值。
for idx, row in df.itertuples():
# logic goes here
推荐阅读
- python - 选择多个条件 - 2 个数据框 - 创建新列
- python - 3.10 和其他版本的 Python 线程差异
- javascript - React 动态设置多个状态
- c# - EF Core多对多查询加入3个表
- vaadin - Vaadin 21:在区域设置更改时使用 ItemLabelGenerator 重新翻译列
- javascript - 未能加载简单的 onclick 事件以以角度显示文本框值
- python - 如何判断数字是否可以写为 n 个不同平方的总和?
- python - 在 Tensorflow 中使用来自大型 numpy 数组的数据集
- sql - 使用枢轴运算符除以成绩总和
- drools - Drools - KIEServer 插入对象然后没有显示在响应中