问题总结
我有一个数据集提供给我,其中有作为字符串提供的地理坐标,带前导空格和正/负符号和数字之间的空格。数据集大约有7000行,所以不是很大,但是我写的简单函数将坐标转换为浮点数,每列需要00:01:20(1分20秒)-这是非常慢的!我正在使用Python 3.9,在平板电脑(Windows 11 Home,16 Gb RAM,英特尔酷睿i7 1.3 GHz)上使用VSCode和Jupyter Notebook。我将数据作为Pandas DataFrame引入。我将字符串转换为数字的目标是通过下面的代码实现的,但是需要转换的列越多,速度就越慢。
我尝试过的...
下面的代码显示,我所做的一切就是使用iterrows()
的for循环遍历DataFrame,使用split
将每个字符串拆分在空格周围,并将结果通过if
循环来确定是否为负数。然后,根据逻辑测试的结果,拆分字符串的数字部分转换为-float
或float
。此时,我将浮点重新分配给该行的条目,并将其插入到DataFrame中。
这个可以。但我觉得它可以更快。我有一种预感,我雇用Pandas的方式错误,并陷入困境。我希望它运行得更快,因为我将使用这个例程来处理越来越大的数据集。
下面我介绍两个功能:
generate_string_coords
-一个函数,用于生成我提供的字符串类型。我在这里做一个工具,我无法控制原材料(数据)。因此,这个函数只是生成与我的原始数据一样的字符串,你可以使用length
变量生成任意多或任意少的字符串。convert_string_coords_to_floats
-将人工字符串转换为浮点数的函数。这是我当前密码的祸根;一旦使用#1中描述的函数生成数据集,我想知道如何优化#2中描述的函数。
关键在于:当我尝试使用length=10000
(超过我的数据集)时,这两个函数都需要大约00:00:02.7(2.7秒)来运行!这比我的代码快得多,我想知道Pandas是否正在搜索DataFrame的每个系列(行)的60多个成员。
部分代码:
生成虚拟数据,其行为类似于提供给我的坐标:
def generate_string_coords(length):
nums = np.random.uniform(-3, 6, (length, )).tolist()
signs = []
for num in nums:
if num < 0:
signs.append(' - ')
else:
signs.append(' + ')
strings = [sign+str(abs(num))for sign, num in zip(signs, nums)]
strings_df = pd.DataFrame(strings, columns=['coords'])
return strings_df
字符串
将伪数据从字符串转换为浮点数:
def convert_str_coords_to_floats(strings_df):
for x, row in enumerate(strings_df.iterrows()):
print(x)
a = row[1]['coords']
if a.split()[0] == '-':
num_a = -float(a.split()[1])
else:
num_a = float(a.split()[1])
row[1]['coords'] = num_a
strings_df.iloc[x] = row[1]
return strings_df
型
有谁能告诉我有没有更有效的方法来做我需要的事情?谢谢你,谢谢
1条答案
按热度按时间unhi4e5o1#
您可以使用series.str.replace()和astype(float)来广播更改,而不是迭代(循环中的打印会带来无用的开销)
字符串