我正在尝试从包含地震数据的 csv 中提取纬度、经度、震级和时间,以便将它们绘制到 map 中。
我当前提取数据的代码是:
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']
如果这个问题之前已经得到解答,我很抱歉,我试图查找它,但我没有设法得到我在代码中找到的答案。
最佳答案
您有一个 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
调用中的名称,但它们不是过滤器。我在这里根本不会使用名称
,而是让 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
名称来反射(reflect)这是一个数据帧。
只有一行,因此您可以通过将每个系列转换为列表并生成单个值来获取数据:
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 .
关于python - 迭代数据框仅返回列标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46186352/