【问题标题】:Convert Strings to Numbers in DataFrame Pandas在 DataFrame Pandas 中将字符串转换为数字
【发布时间】:2020-09-17 17:44:53
【问题描述】:

背景: 我从谷歌地图中获得了一个点列表,提取数据为 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

感谢您的帮助。

【问题讨论】:

  • 你的代码在哪里?

标签: python pandas dataframe data-cleaning data-conversion


【解决方案1】:

您需要将位置中的数字存储为单独的列(我假设这些是纬度/经度坐标),以便将它们视为数字并按照您的预期工作。理想情况下,您应该更改 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

【讨论】:

  • 我没有将 JSON 文件读入我的数据框。我从 CSV 文件开始,然后清理数据并将其导出到 JSON 文件,但感谢您的回复,这真的很有帮助。我将用你的方法再试一次。感谢您的深入回应,真的很好!
  • 问题是否有结合 lat 和 long 并保持 float64 格式?我尝试了 list(zip(df.lat, df.long)),但我的组合 zip 再次使它成为一个对象。
  • 不幸的是没有。当您将这些数字压缩在一起时,您最终会将它们变成一列元组。由于列中的值是元组,pandas 无法确定它们是浮点数,因为它可以“看到”的只是元组而不是其中的数字。出于好奇,你为什么要他们在一起?
  • 我明白了,感谢您的跟进。我希望它们在一起,这样当我在我的 javascript 文件中调用坐标时,我可以将其称为:L.marker(city.location)(使用传单)
  • 啊,我从来没有使用过传单。但是有可能做类似的事情:L.marker({"lat": city.lat, "lon": city.lon}) 基于this documentation。或者,您可以尝试通过 this stackoverflow answer 在 javascript 中压缩这些数组
猜你喜欢
  • 2020-05-22
  • 2020-04-12
  • 2020-11-20
  • 1970-01-01
  • 2017-06-04
  • 2018-07-13
  • 2021-06-24
  • 2013-02-06
  • 2020-04-21
相关资源
最近更新 更多