Can';t将字符串转换为float-Python破折号

Can';t将字符串转换为float-Python破折号,python,pandas,plotly-dash,Python,Pandas,Plotly Dash,我试图在Dash回调中将字符串转换为float,但当我运行代码时,我在Dash应用程序中遇到错误:lati=float(lati[-1]) ValueError:无法将字符串转换为float:'float64)但我在终端中没有收到此错误 首先,我需要做的是提取给定的纬度(和经度)数字。因此,我需要它将其转换为字符串并拆分它,因为我无法找到更好的方法使用pandas从csv文件中获取此数字 输出: # converting to string: 12 41.6796 Name: latitu

我试图在Dash回调中将字符串转换为float,但当我运行代码时,我在Dash应用程序中遇到错误:lati=float(lati[-1]) ValueError:无法将字符串转换为float:'float64)但我在终端中没有收到此错误

首先,我需要做的是提取给定的纬度(和经度)数字。因此,我需要它将其转换为字符串并拆分它,因为我无法找到更好的方法使用pandas从csv文件中获取此数字

输出:

# converting to string:
12    41.6796
Name: latitude, dtype: float64

# splitting:
['12', '', '', '', '41.6796']

# converting to float:
41.6796
这是实际代码:

@app.callback(Output('text-output', 'children'),
    [Input('submit-val', 'n_clicks')],
    [State('search-input', 'value')])
def updateText(n_clicks, searchVar):
    df = pd.read_csv("powerplant.csv")
    df = df[df.name == searchVar]

    # converting to string
    lati = str(df['latitude'])
    longi = str(df['longitude'])

    # splitting it
    lati = lati.split('\n', 1)
    lati = lati[0].split(' ', 4)
    longi = longi.split('\n', 1)
    longi = longi[0].split(' ', 4)

    #converting to float
    lati = float(lati[-1])
    longi = float(longi[-1]) 
实际上,我在其他脚本中测试了这段代码,效果很好。有没有更好的方法来提取纬度和经度数字

数据可以从这里下载,这是一个摘录

country,country_long,name,gppd_idnr,capacity_mw,latitude,longitude,primary_fuel,other_fuel1,other_fuel2,other_fuel3,commissioning_year,owner,source,url,geolocation_source,wepp_id,year_of_capacity_data,generation_gwh_2013,generation_gwh_2014,generation_gwh_2015,generation_gwh_2016,generation_gwh_2017,estimated_generation_gwh
AFG,Afghanistan,Kajaki Hydroelectric Power Plant Afghanistan,GEODB0040538,33.0,32.3220,65.1190,Hydro,,,,,,GEODB,http://globalenergyobservatory.org,GEODB,1009793,2017,,,,,,
AFG,Afghanistan,Mahipar Hydroelectric Power Plant Afghanistan,GEODB0040541,66.0,34.5560,69.4787,Hydro,,,,,,GEODB,http://globalenergyobservatory.org,GEODB,1009795,2017,,,,,,
ALB,Albania,Shkopet,WRI1002173,24.0,41.6796,19.8305,Hydro,,,,1963.0,,Energy Charter Secretariat,http://www.energycharter.org/fileadmin/DocumentsMedia/IDEER/IDEER-Albania_2013_en.pdf,GEODB,1021238,,,,,,,79.22851153039832
ALB,Albania,Ulez,WRI1002174,25.0,41.6796,19.8936,Hydro,,,,1958.0,,Energy Charter Secretariat,http://www.energycharter.org/fileadmin/DocumentsMedia/IDEER/IDEER-Albania_2013_en.pdf,GEODB,1021241,,,,,,,82.52969951083159

您所看到的是一个
pandas.Series
对象,它包含一行数据,您试图切碎它的
\uuu repr\uuu
,以获得值。没有这个必要。我不熟悉plotly的Python版本,但我看到您有一个回调,因此我将其包装到一个函数中(我不确定是否存在找不到名称的情况):


问题在于访问数据帧中的值的方式。Pandas允许您访问数据,而无需解析字符串表示

您可以通过调用
.loc
如果知道只有一个值,可以调用
square
方法

>>> import pandas as pd
>>> from io import StringIO
>>> # data shortened for brievity
>>> df = pd.read_csv(StringIO("""country,country_long,name,gppd_idnr,capacity_mw,latitude,longitude
... AFG,Afghanistan,Kajaki Hydroelectric Power Plant Afghanistan,GEODB0040538,33.0,32.3220,65.1190
... AFG,Afghanistan,Mahipar Hydroelectric Power Plant Afghanistan,GEODB0040541,66.0,34.5560,69.4787
... ALB,Albania,Shkopet,WRI1002173,24.0,41.6796,19.8305
... ALB,Albania,Ulez,WRI1002174,25.0,41.6796,19.8936"""))
>>> searchVar = "Ulez"
>>> df.loc[df["name"] == searchVar, "latitude"] # here you have a pd.Series
3    41.6796
Name: latitude, dtype: float64
>>> df.loc[df["name"] == searchVar, "latitude"].squeeze() # here you have a scalar
41.6796
>>> df.loc[df["name"] == searchVar, "longitude"].squeeze()
19.8936

如果出于某种原因,您有多行具有相同的名称,那么您将返回一个系列,而不是标量。但是,在这种情况下,失败可能是您想要的,而不是传递不明确的数据。

当您运行此代码,但打印
lati[-1]
而不是尝试转换它时,会得到什么结果……输出是什么?你得到的是准确的41.6796还是其他什么?csv rader似乎没有正确转换您的列…您可以从
powerplant.csv
添加一些示例行吗?错误消息表明您最终处理了字符串
Name:latitude,dtype:float64
。你的问题不清楚这是从哪里来的,或者你如何避免它,但也许至少这会让你朝着正确的方向前进。如果您仍然需要帮助,请澄清。你能提供一个显示此问题的CSV片段吗?@yossefaz在提交了发电厂终端的名称后,正在打印正确的数字。@tripleee实际上我去掉了这个部件名:latitude,数据类型:2步后浮动64:
1步:12 41.6796名称:纬度,数据类型:浮动64 2步:['12 41.6796','名称:纬度,数据类型:float64']3步:['12','','','','',41.6796']4步骤:41.6796
谢谢。它可以工作,但我正在尝试将这些纬度和经度数字转换为float,然后我得到一个类型错误:无法将序列转换为
lati=df.loc[df[“name”]==searchVar,“latitude”].squence()loni=df.loc[df[“name”]==searchVar,“longitude”].squence()看起来有几个同名的值。在
squence()之后
您应该已经有了一个float,除非有几个值,否则您将有一个series是的,这就是我的想法,但这里有一个错误:ValueError:layout.mapbox.center的'lon'属性接收到的'pandas.core.series.series'类型的无效值。接收到的值:series([],Name:longitude,dtype:float64)“lon”属性是一个数字,可以指定为:-int或float似乎问题是一个空序列。你确定你的名字在数据框中吗?你需要用函数处理这个问题是的。你是对的。现在它可以按照我的要求工作。非常感谢。祝你愉快!@Michal这一点都不相似。我的代码是自给自足-您只需更改CSV的名称
>>> import pandas as pd
>>> from io import StringIO
>>> # data shortened for brievity
>>> df = pd.read_csv(StringIO("""country,country_long,name,gppd_idnr,capacity_mw,latitude,longitude
... AFG,Afghanistan,Kajaki Hydroelectric Power Plant Afghanistan,GEODB0040538,33.0,32.3220,65.1190
... AFG,Afghanistan,Mahipar Hydroelectric Power Plant Afghanistan,GEODB0040541,66.0,34.5560,69.4787
... ALB,Albania,Shkopet,WRI1002173,24.0,41.6796,19.8305
... ALB,Albania,Ulez,WRI1002174,25.0,41.6796,19.8936"""))
>>> searchVar = "Ulez"
>>> df.loc[df["name"] == searchVar, "latitude"] # here you have a pd.Series
3    41.6796
Name: latitude, dtype: float64
>>> df.loc[df["name"] == searchVar, "latitude"].squeeze() # here you have a scalar
41.6796
>>> df.loc[df["name"] == searchVar, "longitude"].squeeze()
19.8936