我从网址读取了csv,我想构建一个独特的数据帧。 csv对应于唯一位置的一个参数的测量的时间序列(例如,每个url与位置和唯一参数相关联)。
parameter = ['pm10','pm2.5','o3','no2']
location = [ 'Nabel_LUG', 'Nabel_MAG']
urls = []
dfs = []
CSV_URL = 'http://www.oasi.ti.ch/web/rest/measure/csv?domain=air&resolution=y¶meter={}&from=2007-01-01&to=2017-04-28&location={}'
for l in location:
for p in parameter:
url = CSV_URL.format( p, l)
urls.append(url)
urls
这里是一个网址列表,我从中获得了csv' s。
dfs = [(pd.read_csv(url, comment='#', sep=';', usecols=[0, 1], index_col='data')) for url in urls]
result_pm10 = pd.concat(dfs, keys=location)
result_pm10
是一个数据框,其中包含特定参数的所有位置时间序列,例如:
data PM10
Nabel_LUG 01.07.2011 01:00 21.0
Nabel_LUG 01.07.2012 01:00 21.0
Nabel_LUG 01.07.2013 01:00 18.0
Nabel_LUG 01.07.2014 01:00 15.0
Nabel_LUG 01.07.2015 01:00 18.0
Nabel_LUG 01.07.2016 01:00 16.0
Nabel_LUG 01.07.2017 01:00 24.0
Nabel_MAG 01.07.2011 01:00 24.0
Nabel_MAG 01.07.2012 01:00 21.0
Nabel_MAG 01.07.2013 01:00 19.0
Nabel_MAG 01.07.2014 01:00 15.0
Nabel_MAG 01.07.2015 01:00 19.0
Nabel_MAG 01.07.2016 01:00 15.0
Nabel_MAG 01.07.2017 01:00 22.0
我想获得类似这样的东西
data PM10 O3 NO2
Nabel_LUG 01.07.2011 01:00 21.0 683.0 34.0
Nabel_LUG 01.07.2012 01:00 21.0 668.0 32.0
Nabel_LUG 01.07.2013 01:00 18.0 707.0 31.0
Nabel_LUG 01.07.2014 01:00 15.0 366.0 29.0
Nabel_LUG 01.07.2015 01:00 18.0 804.0 30.0
Nabel_LUG 01.07.2016 01:00 16.0 550.0 28.0
Nabel_LUG 01.07.2017 01:00 24.0 45.0 37.0
Nabel_MAG 01.07.2011 01:00 24.0 540.0 20.0
Nabel_MAG 01.07.2012 01:00 21.0 432.0 19.0
Nabel_MAG 01.07.2013 01:00 19.0 494.0 18.0
Nabel_MAG 01.07.2014 01:00 15.0 259.0 20.0
Nabel_MAG 01.07.2015 01:00 19.0 596.0 18.0
Nabel_MAG 01.07.2016 01:00 15.0 363.0 21.0
Nabel_MAG 01.07.2017 01:00 22.0 65.0 24.0
但是我只能通过分别为每个参数重复上面的代码然后执行类似
的操作来做到这一点df_parameter = [result_pm10, result_pm25, result_o3, result_no2]
result = pd.concat(df_parameter, axis=1)
有一种方法可以更有效地实现这一点(特别是当参数多得多时)?
答案 0 :(得分:0)
您有覆盖数据的问题。因此,您可以在每个循环中使用两个列表进行追加,如果需要删除所有NaN
添加dropna
的所有列,rename_axis
用于设置索引名称,这些列在{{之后转换1}}到列名:
reset_index
parameter = ['pm10','pm2.5','o3','no2']
location = [ 'Nabel_LUG', 'Nabel_MAG']
dfs = []
CSV_URL = 'http://www.oasi.ti.ch/web/rest/measure/csv?domain=air&resolution=y¶meter={}&from=2007-01-01&to=2017-04-28&location={}'
for l in location:
dfs1 = []
for p in parameter:
url = CSV_URL.format( p, l)
df = pd.read_csv(url, comment='#', sep=';', usecols=[0, 1], index_col='data')
dfs1.append(df)
dfs.append(pd.concat(dfs1, axis=1))
result_pm10 = pd.concat(dfs, keys=location)
.rename_axis(('location','data'))
.dropna(axis=1, how='all')
.reset_index()
print (result_pm10)