从url读取csv时如何在pandas中合并和连接

时间:2017-05-04 03:50:44

标签: python pandas

我从网址读取了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&parameter={}&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)

有一种方法可以更有效地实现这一点(特别是当参数多得多时)?

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&parameter={}&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)