Python 将列转换为中的浮动

Python 将列转换为中的浮动,python,pandas,Python,Pandas,在这个问题上,我已经被困了很长时间: 我正在从一个.csv文件中读取一些数据,一些数字元素已保存为列表,逗号作为千位分隔符。此外,数据还包括一些NaN 首先我要加载csv: df = pd.read_csv('my_data.csv') 然后我看着头: df.head() index val 0 ['12,345,678.90'] 1 ['2,345.67'] 2 NaN Dtype: Object 我的目标是使此列的Dtype=Float64,如下所

在这个问题上,我已经被困了很长时间:

我正在从一个.csv文件中读取一些数据,一些数字元素已保存为列表,逗号作为千位分隔符。此外,数据还包括一些NaN

首先我要加载csv:

df = pd.read_csv('my_data.csv')
然后我看着头:

df.head()
index   val
0       ['12,345,678.90']
1       ['2,345.67']
2       NaN
Dtype: Object
我的目标是使此列的Dtype=Float64,如下所示:

df.head()
index   val
0       12345678.90
1       2345.67
2       NaN
Dtype: Float64
def convert_float(val):
     new_val = val.replace(',','').replace('[', '').replace(']', '').replace("'", "")
     return float(new_val)
目前,我尝试了以下方法:

使用lambda

df['val'].apply(lambda x: x.replace('[', '').replace(']', '').replace(',', '')).astype('float')
我得到了一个错误:

AttributeError: 'float' object has no attribute 'replace'
我不知道为什么会出现这个错误。我的列的数据类型是“Dtype('O')”,这意味着它是一个“对象”(字符串)。也许NaN被认为是一个浮子

定义自定义函数并应用它:

我从中得到了这个方法,这很好

所以我定义我的函数如下:

df.head()
index   val
0       12345678.90
1       2345.67
2       NaN
Dtype: Float64
def convert_float(val):
     new_val = val.replace(',','').replace('[', '').replace(']', '').replace("'", "")
     return float(new_val)
然后我根据我的数据调用它:

df['val'] = df['val'].apply(convert_float)
但我还是得到了同样的错误:

AttributeError: 'float' object has no attribute 'replace'
 AttributeError: 'float' object has no attribute 'replace'
迭代行以进行修改:

我觉得这不是最好的做法,我知道做这样的迭代在计算上是可以扩展的,但我仍然无法让它工作,我正试图知道为什么

我编写了以下代码:

for index, row in df.iterrows():
    row['val'] = float(row['val'].replace(',','').replace('[', '').replace(']', '').replace("'", ''))
但在调用它时,我仍然得到相同的错误:

AttributeError: 'float' object has no attribute 'replace'
 AttributeError: 'float' object has no attribute 'replace'
我还尝试测试该值是否为NaN,以便仅对非NaN值执行操作:

for index, row in df.iterrows():
    if(not pd.isna(row['val'])):
        row['val'] = float(row['val'].replace(',','').replace('[', '').replace(']', '').replace("'", ''))
而且它有效!这次我没有收到任何错误,但是我的数据类型仍然是“Object”

是不是我应该以不同的方式处理NaN? 加载csv时,处理这种情况的最佳做法是什么


谢谢

好的,最后我找到了答案:简单地将类型转换为“str”

我不确定它最初为什么将NaN视为Float,但下面的代码实现了我的目标:

df['val'].apply(lambda x: str(x).replace('[', '').replace(']', '').replace(',', '').replace("'", "")).astype('float')

谢谢大家

我来晚了一点,但您甚至不需要使用apply或lambda来完成此操作

df2['val'] = df2['val'].str.replace('[', '').str.replace(']', '').str.replace("'", '').str.replace(",", '').fillna(0).astype(float)

在同一个变量上执行所有这些操作都会得到相同的结果

找到数字和“.”,并将其合并在一起

obj = df['val'].fillna('').str.findall('\d+|\.').str.join('')
obj[obj == ''] = np.nan
df['val'] = obj.astype(np.float)