Python 签署「-&引用;在数字之后

Python 签署「-&引用;在数字之后,python,pandas,for-loop,Python,Pandas,For Loop,我有一个数据框,其中包含一列数字,如下所示: 1. 34.5 2. 345.2 3. 898.4- 4. 87.4 ... n. 847.3- 该列是str,现在我已经编写了一个循环整个列(大约1900万行)的代码。 我问是否有人知道一种更快的方法,将“-”放在前面,并将str改为数字 我的代码: for i, row in frame.iterrows(): Val=row[9] if row[9].find("-") > 0 : Val=

我有一个数据框,其中包含一列数字,如下所示:

 1. 34.5
 2. 345.2
 3. 898.4-
 4. 87.4

...

 n. 847.3-
该列是str,现在我已经编写了一个循环整个列(大约1900万行)的代码。 我问是否有人知道一种更快的方法,将“-”放在前面,并将str改为数字

我的代码:

for i, row in frame.iterrows():
    Val=row[9]
    if row[9].find("-") > 0 :
        Val="-"+row[9].replace("-","")
        frame.iloc[i,9]=Val
frame[frame.columns[9]]=pd.to_numeric(frame[frame.columns[9]]

查看本页的“应用函数”部分,该部分解释了在整个帧上迭代会很慢,而使用
apply()
函数

它看起来像这样

def remove_hyphen(x):
    return x.replace("-", "")

frame["column_name"] = frame["column_name"].apply(remove_hyphen)

让我们尝试两个调用
pd.to\u numeric
。第一种方法得到所有正确的正数,第二种方法将填充在第一次尝试时强制为
NaN
的负数。非数值仍然强制为
NaN

import pandas as pd
s = pd.Series(['34.5', '345.2', '898.4-', '87.4', '847.3-', 'foobar', 'f-']) 



您可以在
str
的帮助下直接执行此操作:

frame.loc[frame[col_name].str[-1] == '-', col_name] = '-' + frame.loc[
                    frame[col_name].str[-1] == '-', col_name].str.replace('-', '')
frame[col_name] = frame[col_name].astype('float')

这回答了你的问题吗?如果可以使用
str.replace
,为什么要使用apply?当前OP正在遍历表中的所有行。apply()只是意味着他可以将单个列的工作交给一个函数来替换,因此应该快得多。但是他只针对一个列?最好使用矢量化解决方案或类似np的解决方案。其中,使用标准循环将非常缓慢,因为一列字符串的行数为1900万行。
0     34.5
1    345.2
2   -898.4
3     87.4
4   -847.3
5      NaN
6      NaN
dtype: float64
frame.loc[frame[col_name].str[-1] == '-', col_name] = '-' + frame.loc[
                    frame[col_name].str[-1] == '-', col_name].str.replace('-', '')
frame[col_name] = frame[col_name].astype('float')