【问题标题】:Iterating over dataframe returns only column headers迭代数据框仅返回列标题
【发布时间】:2017-09-12 22:43:52
【问题描述】:

我正在尝试从包含地震数据的 csv 中提取纬度、经度、震级和时间,以便将它们绘制成地图。

我目前提取数据的代码是:

import pandas as pd

csv_path = 'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_hour.csv'
filename = pd.read_csv(csv_path, names = ['time','latitude','longitude','mag'])
lats, lons = [], []
magnitudes = []
timestrings = []

for row in filename:
    print (row)
    lats.append(row[1])
    lons.append(row[2])
    magnitudes.append(row[2])
    timestrings.append(row[0])

# Printing this to check if the values are correctly imported
# This is, instead, printing the second letter of each word
print('lats', lats[0:5])
print('lons', lons[0:5])

但我的输出是:

time
latitude
longitude
mag
lats ['i', 'a', 'o', 'a']
lons ['m', 't', 'n', 'g']

很抱歉,如果之前有人回答过这个问题,我试图查找它,但我没有设法得到我在代码中找到的答案。

【问题讨论】:

  • filename 是一个熊猫数据框。它不是一个文件。也许您正在寻找 csv.reader() 对象?
  • 如果我将代码更改为:"csv_data = csv.reader(filename) for row in csv_data:...." 我得到 "File ------- line 12, in lats.append(row[1]) IndexError: list index out of range
  • csv.reader() 采用 文件对象 或可迭代的。不是文件名。
  • 迭代 pd.DataFrame 会产生它的的名称。
  • 现在我看到了不同之处。我仍然很难处理像这样的所有微妙之处。谢谢!

标签: python pandas matplotlib dataframe plot


【解决方案1】:

您有一个 pandas 数据框,而不是一个文件。对数据框的迭代为您提供系列的标题

>>> import pandas as pd
>>> filename = pd.read_csv('https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_hour.csv', names = ['time','latitude','longitude','mag'])
>>> list(filename)
['time', 'latitude', 'longitude', 'mag']

这些名称是您传递给read_csv 调用的名称,但它们不是过滤器。我不会在这里使用names,让 Pandas 找出有哪些列,然后从中挑选:

>>> df = pd.read_csv('https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_hour.csv')
>>> df.time
0    2017-09-12T22:13:27.650Z
Name: time, dtype: object
>>> df.latitude
0    58.0241
Name: latitude, dtype: float64
>>> df.longitude
0   -32.3543
Name: longitude, dtype: float64
>>> df.mag
0    4.8
Name: mag, dtype: float64

我使用了一个更常见的 df 名称来反映这是一个数据框。

只有一行,因此您可以通过将每个系列转换为列表来获取数据,生成单个值:

df = pd.read_csv('https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_hour.csv')
time = df.time.tolist()
lats = df.latitude.tolist()
longs = df.longitude.tolist()
magnitudes = df.mag.tolist()

但是,如果您想绘制数据,您可以直接从数据框中执行此操作,而无需手动提取列表。见Pandas Visualisation

【讨论】:

  • 或者更好的是,保持数据框完整!
  • @juanpa.arrivillaga 我现在链接到可视化教程。
  • 再次感谢您的关注!我设法在所有帮助下让它工作,但你的帖子是尤里卡的!在解决这个问题的过程中肯定学到了很多东西。
猜你喜欢
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2013-12-22
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 2019-05-09
相关资源
最近更新 更多