熊猫在同一列上导入具有索引级别的multiindex csv

时间:2019-10-09 07:24:32

标签: python pandas csv

我有一个以下格式的多索引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   ... 

2 个答案:

答案 0 :(得分:2)

您可以编码gbk以读取

df=pd.read_csv('./AirEmissions117.csv',sep=';',encoding='gbk')

答案 1 :(得分:1)

对我来说,工作集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())

相关问题