首页 > 解决方案 > 在 DataFrame Pandas 中将字符串转换为数字

问题描述

背景: 我从谷歌地图中获得了一个点列表,提取数据为 csv。在 Pandas 中清理它,并将其导出为 JSON 文件。(用于出口的记录)

问题: 坐标是字符串。这是有道理的,因为最初,坐标与 url 相关联

Example: https://www.google.com/maps/search/{coordinates}

我使用替换功能清除文本,只保留坐标。有没有办法让我的值在我的位置列数字类型中,并将它们放在一个列表中。

导出的 JSON文件的样机数据示例:

[
{
      "Bin":"Yes",
      "Location":"##.##,-###.##"
   },

我试图清理我的数据看起来像下面的例子

我尝试建模的GeoJSON文件示例

[
{
    location: [41.8781, -87.6298],
    city: "Chicago"
  },

目标: 我正在尝试制作一个自定义地图供我在 mapbox 中使用

我的DataFrame的样机示例

    Bin         Location
0   Yes         ##.##,-###.##
1   Yes         ##.##,-###.##

输入:df.types

Output:
Bin          object
Location     object
dtype: object

感谢您的帮助。

标签: pythonpandasdataframedata-cleaningdata-conversion

解决方案


您需要将位置中的数字存储为单独的列(我假设这些是纬度/经度坐标),以便将它们视为数字并按预期工作。理想情况下,您应该更改 json 清理代码以在将其读入数据帧之前返回如下所示的结果:

{
    lat: 41.8781,
    long: -87.6298,
    city: "Chicago"
}

但是,一旦它在数据框中,您也可以解决此问题:

json_data = [
    {"location": [41.8781, -87.6298], "city": "chicago"},
    {"location": [44.8141, 20.1234], "city": "somewhere"}
]

df = pd.DataFrame.from_records(json_data)

print(df)
    location            city
0   [41.8781, -87.6298] chicago
1   [44.8141, 20.1234]  somewhere

print(df.dtypes)
location    object
city        object
dtype: object

应用我们的转换:

df[["lat", "long"]] = pd.DataFrame(df["location"].tolist(), columns=["lat", "long"])

print(df)
    location            city      lat       long
0   [41.8781, -87.6298] chicago   41.8781   -87.6298
1   [44.8141, 20.1234]  somewhere 44.8141   20.1234

print(df.dtypes)
location     object
city         object
lat         float64
long        float64
dtype: object

我们刚刚所做的是告诉 pandas 我们的“位置”列实际上有 2 个值,它们应该在不同的列中。我们扩展它并将其添加回原始数据框。

如果出于某种原因,pandas 不会自动将您的 lat/long 列解析为浮点数,您可以使用pd.to_numeric将对象列转换为 integer/float dtypes。

df["lat"] = pd.to_numeric(df["lat"])
df["long"] = pd.to_numeric(df["long"])

print(df)
              location       city      lat     long
0  [41.8781, -87.6298]    chicago  41.8781 -87.6298
1   [44.8141, 20.1234]  somewhere  44.8141  20.1234

print(df.dtypes)
location     object
city         object
lat         float64
long        float64
dtype: object

推荐阅读