我有一个具有以下格式的多索引csv:
; ;2000;2001;2002;2003;2004;2005;2006;2007;2008;2009;2010;2011;2012;2013;2014;2015;2016;2017
CO2;;;;;;;;;;;;;;;;;;;
010000 Agriculture and horticulture;AZZ;2312;2249;2165;2102;2034;2095;2106;2067;2060;1935;1985;1983;1893;1865;1750;1728;1777;1736
020000 Forestry;AZZ;40;42;39;43;46;50;49;49;46;52;62;62;67;60;63;66;67;66
030000 Fishing;AZZ;785;767;746;722;645;655;629;580;501;485;472;441;351;384;352;382;387;377
; ;2000;2001;2002;2003;2004;2005;2006;2007;2008;2009;2010;2011;2012;2013;2014;2015;2016;2017
More CO2;;;;;;;;;;;;;;;;;;;
010000 Agriculture and horticulture;AZZ;2312;2249;2165;2102;2034;2095;2106;2067;2060;1935;1985;1983;1893;1865;1750;1728;1777;1736
020000 Forestry;AZZ;40;42;39;43;46;50;49;49;46;52;62;62;67;60;63;66;67;66
030000 Fishing;AZZ;785;767;746;722;645;655;629;580;501;485;472;441;351;384;352;382;387;377
因此,MultiIndex 的两个级别实际上位于同一列上。
我正在尝试按如下方式导入它:
df=pd.read_csv('my.csv',sep=";",header=[0],index_col=[0])
但这会返回以下错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 24: invalid start byte
我不确定位置 24 指的是哪里以及如何继续导入文件。
这是该文件的链接: https://wetransfer.com/downloads/338c3aa2ef68052b45d29c509d5bf82120191009073413/88bc558e72adc48e8683d8af2792d51d20191009073413/81d59b
期望的输出
2000 2001 2002 2003 ...
CO2 010000 Agriculture and horticulture AZZ 2312.0 2249.0 2165.0 2102.0 ...
020000 Forestry AZZ 40.0 42.0 39.0 43.0 ...
030000 Fishing AZZ 785.0 767.0 746.0 722.0 ...
060000 Extraction of oil and gas BZ1 2174.0 2190.0 2184.0 2188.0 ...
080090 Extraction of gravel and stone BZ2 295.0 332.0 304.0 277.0 ...
2000 2001 2002 2003 ...
More CO2 010000 Agriculture and horticulture AZZ 2312.0 2249.0 2165.0 2102.0 ...
020000 Forestry AZZ 40.0 42.0 39.0 43.0 ...
030000 Fishing AZZ 785.0 767.0 746.0 722.0 ...
060000 Extraction of oil and gas BZ1 2174.0 2190.0 2184.0 2188.0 ...
080090 Extraction of gravel and stone BZ2 295.0 332.0 304.0 277.0 ...
你可以编码gbk来读取
df=pd.read_csv('./AirEmissions117.csv',sep=';',encoding='gbk')
对我来说,工作集encoding
然后是必要的一些处理:
df = pd.read_csv('AirEmissions117.csv',
sep=";",
encoding = "ISO-8859-1",
)
#check if last 5 columns contains only NaN
m = df.iloc[:, -5:].isna().all(1)
#create new column in first position by types
df.insert(0, 'type', df.iloc[:, 0].where(m).ffill())
#remove NaNs rows and create MultiIndex
df = df[~m].set_index(df.columns[:3].tolist())