首页 > 解决方案 > 如何从 url 读取数据到 pandas 数据框

问题描述

我正在尝试使用熊猫从https://download.bls.gov/pub/time.series/ee/ee.industry读取数据,如下所示:

import pandas as pd

url = 'https://download.bls.gov/pub/time.series/ee/ee.industry'
df = pd.read_csv(url, sep='\t')

还尝试获取分隔符:

import pandas as pd

url = 'https://download.bls.gov/pub/time.series/ee/ee.industry'
reader = pd.read_csv(url, sep = None, iterator = True)
inferred_sep = reader._engine.data.dialect.delimiter

df = pd.read_csv(url, sep=inferred_sep)

但是数据的格式不是很周密,数据框的列是正确的:

>>> df.columns
Index(['industry_code', 'SIC_code', 'publishing_status', 'industry_name'], dtype='object')

但是数据与列不对应,似乎所有数据都合并到前两列中,最后两列没有任何数据。关于更好地获取这些数据的任何建议/想法?

编辑 expexted 结果应该是这样的:

行业代码 SIC_code 发布状态 行业名称
000000 不适用 非农总量 1 T 1

标签: pythonpython-3.xpandasdataframecsv

解决方案


阅读器运行良好,但标题中的列数不正确。您可以使用其他列取回.reset_index(),然后重命名这些列:

>>> df = pd.read_csv(url, sep='\t')
>>> n_missing_headers = df.index.nlevels
>>> cols = df.columns.to_list() + [f'col{n}' for n in range(n_missing_headers)]
>>> df.reset_index(inplace=True)
>>> df.columns = cols
>>> df.head()
   industry_code SIC_code publishing_status    industry_name  col0 col1  col2
0              0      NaN                 B    Total nonfarm     1    T     1
1           5000      NaN                 A    Total private     1    T     2
2           5100      NaN                 A  Goods-producing     1    T     3
3         100000    10-14                 A           Mining     2    T     4
4         101000       10                 A     Metal mining     3    T     5

如果需要,您可以保留前 4 列:

>>> df.iloc[:, :-n_missing_headers].head()
   industry_code SIC_code publishing_status    industry_name
0              0      NaN                 B    Total nonfarm
1           5000      NaN                 A    Total private
2           5100      NaN                 A  Goods-producing
3         100000    10-14                 A           Mining
4         101000       10                 A     Metal mining

推荐阅读