pandas 在Python中将字符串转换为浮点数的慢速转换--加快速度的方法?

y1aodyip  于 2023-08-01  发布在  Python
关注(0)|答案(1)|浏览(153)

问题总结

我有一个数据集提供给我,其中有作为字符串提供的地理坐标,带前导空格和正/负符号和数字之间的空格。数据集大约有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循环来确定是否为负数。然后,根据逻辑测试的结果,拆分字符串的数字部分转换为-floatfloat。此时,我将浮点重新分配给该行的条目,并将其插入到DataFrame中。
这个可以。但我觉得它可以更快。我有一种预感,我雇用Pandas的方式错误,并陷入困境。我希望它运行得更快,因为我将使用这个例程来处理越来越大的数据集。
下面我介绍两个功能:

  1. generate_string_coords-一个函数,用于生成我提供的字符串类型。我在这里做一个工具,我无法控制原材料(数据)。因此,这个函数只是生成与我的原始数据一样的字符串,你可以使用length变量生成任意多或任意少的字符串。
  2. 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


有谁能告诉我有没有更有效的方法来做我需要的事情?谢谢你,谢谢

unhi4e5o

unhi4e5o1#

您可以使用series.str.replace()astype(float)来广播更改,而不是迭代(循环中的打印会带来无用的开销)

%%timeit 
#after using your func to generate a 7000-row dataset
df['coords'].str.replace(' ','').astype(float)

13.2 ms ± 952 µs per loop

字符串

相关问题