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')