Pandas read_csv 具有 MultiIndex 列
Pandas read_csv with MultiIndex columns
我有一个如下所示的 csv 文件:
;a1;;;;;;a2;;;;;
;b1;;;b2;;;b1;;;b2;;
;c1;c2;c3;c1;c2;c3;c1;c2;c3;c1;c2;c3
0;0.9803;0.6223;0.3398;0.1376;0.3197;0.4410;0.9854;0.2557;0.4300;0.2170;0.4303;0.2307
1;0.1125;0.2934;0.8716;0.4591;0.4254;0.1810;0.6816;0.7632;0.7135;0.1945;0.0215;0.1310
2;0.1479;0.3473;0.1396;0.1298;0.9051;0.7637;0.9413;0.0467;0.9106;0.2931;0.0108;0.0220
3;0.6559;0.3842;0.8389;0.4315;0.2748;0.2193;0.9306;0.6496;0.6549;0.0835;0.8225;0.0136
当使用 pandas 阅读时,我得到:
df = pd.read_csv(file_path, delimiter=";", header=[0,1,2], index_col=0)
print(df)
a1 Unnamed: 2_level_0 Unnamed: 3_level_0 Unnamed: 4_level_0 a2 Unnamed: 6_level_0 Unnamed: 7_level_0 Unnamed: 8_level_0
b1 Unnamed: 2_level_1 b2 Unnamed: 4_level_1 b1 Unnamed: 6_level_1 b2 Unnamed: 8_level_1
c1 c2 c1 c2 c1 c2 c1 c2
0 0.6979 0.1863 0.4639 0.3777 0.7896 0.3321 0.8255 0.1357
1 0.8593 0.4796 0.4800 0.6605 0.3322 0.8397 0.5421 0.5000
2 0.0205 0.0679 0.3378 0.0636 0.9365 0.4386 0.4939 0.9106
3 0.0052 0.2623 0.8616 0.6671 0.6522 0.8673 0.0300 0.6935
如何让 pandas 将 headers 识别为 MultiIndex 并获得没有未命名列的输出?
a1 a2
b1 b2 b1 b2
c1 c2 c1 c2 c1 c2 c1 c2
0 0.6979 0.1863 0.4639 0.3777 0.7896 0.3321 0.8255 0.1357
1 0.8593 0.4796 0.4800 0.6605 0.3322 0.8397 0.5421 0.5000
2 0.0205 0.0679 0.3378 0.0636 0.9365 0.4386 0.4939 0.9106
3 0.0052 0.2623 0.8616 0.6671 0.6522 0.8673 0.0300 0.6935
谢谢大家!
我认为这里任何体面的解决方案都必须以某种方式利用 pandas.MultiIndex
。
你可以做的是将 header 行 (nrows=3
) 分别读入 DataFrame
并将其转换为可以传递给 [=15= 的列表列表].
诀窍是将选项 keep_default_na
设置为 False
,这样 NaN
值就会被清空,不会出现在结果 header 中。
headers = pd.read_csv(file_path, header=None, nrows=3, delimiter=';',
index_col=0, keep_default_na=False).values.tolist()
df = pd.read_csv(file_path, delimiter=';', header=[0, 1, 2], index_col=0)
df.columns = pd.MultiIndex.from_arrays(headers)
print(df)
这给出了所需的输出:
a1 a2
b1 b2 b1 b2
c1 c2 c3 c1 c2 c3 c1 c2 c3 c1 c2 c3
0 0.9803 0.6223 0.3398 0.1376 0.3197 0.4410 0.9854 0.2557 0.4300 0.2170 0.4303 0.2307
1 0.1125 0.2934 0.8716 0.4591 0.4254 0.1810 0.6816 0.7632 0.7135 0.1945 0.0215 0.1310
2 0.1479 0.3473 0.1396 0.1298 0.9051 0.7637 0.9413 0.0467 0.9106 0.2931 0.0108 0.0220
3 0.6559 0.3842 0.8389 0.4315 0.2748 0.2193 0.9306 0.6496 0.6549 0.0835 0.8225 0.0136
理论上,您还可以设计一个只读取文件一次的解决方案,然后在出现“未命名”的情况下对 header 进行一些操作——但这样的方法是不太可靠(一般情况下你不应该假设 header 格式)。
我有一个如下所示的 csv 文件:
;a1;;;;;;a2;;;;;
;b1;;;b2;;;b1;;;b2;;
;c1;c2;c3;c1;c2;c3;c1;c2;c3;c1;c2;c3
0;0.9803;0.6223;0.3398;0.1376;0.3197;0.4410;0.9854;0.2557;0.4300;0.2170;0.4303;0.2307
1;0.1125;0.2934;0.8716;0.4591;0.4254;0.1810;0.6816;0.7632;0.7135;0.1945;0.0215;0.1310
2;0.1479;0.3473;0.1396;0.1298;0.9051;0.7637;0.9413;0.0467;0.9106;0.2931;0.0108;0.0220
3;0.6559;0.3842;0.8389;0.4315;0.2748;0.2193;0.9306;0.6496;0.6549;0.0835;0.8225;0.0136
当使用 pandas 阅读时,我得到:
df = pd.read_csv(file_path, delimiter=";", header=[0,1,2], index_col=0)
print(df)
a1 Unnamed: 2_level_0 Unnamed: 3_level_0 Unnamed: 4_level_0 a2 Unnamed: 6_level_0 Unnamed: 7_level_0 Unnamed: 8_level_0
b1 Unnamed: 2_level_1 b2 Unnamed: 4_level_1 b1 Unnamed: 6_level_1 b2 Unnamed: 8_level_1
c1 c2 c1 c2 c1 c2 c1 c2
0 0.6979 0.1863 0.4639 0.3777 0.7896 0.3321 0.8255 0.1357
1 0.8593 0.4796 0.4800 0.6605 0.3322 0.8397 0.5421 0.5000
2 0.0205 0.0679 0.3378 0.0636 0.9365 0.4386 0.4939 0.9106
3 0.0052 0.2623 0.8616 0.6671 0.6522 0.8673 0.0300 0.6935
如何让 pandas 将 headers 识别为 MultiIndex 并获得没有未命名列的输出?
a1 a2
b1 b2 b1 b2
c1 c2 c1 c2 c1 c2 c1 c2
0 0.6979 0.1863 0.4639 0.3777 0.7896 0.3321 0.8255 0.1357
1 0.8593 0.4796 0.4800 0.6605 0.3322 0.8397 0.5421 0.5000
2 0.0205 0.0679 0.3378 0.0636 0.9365 0.4386 0.4939 0.9106
3 0.0052 0.2623 0.8616 0.6671 0.6522 0.8673 0.0300 0.6935
谢谢大家!
我认为这里任何体面的解决方案都必须以某种方式利用 pandas.MultiIndex
。
你可以做的是将 header 行 (nrows=3
) 分别读入 DataFrame
并将其转换为可以传递给 [=15= 的列表列表].
诀窍是将选项 keep_default_na
设置为 False
,这样 NaN
值就会被清空,不会出现在结果 header 中。
headers = pd.read_csv(file_path, header=None, nrows=3, delimiter=';',
index_col=0, keep_default_na=False).values.tolist()
df = pd.read_csv(file_path, delimiter=';', header=[0, 1, 2], index_col=0)
df.columns = pd.MultiIndex.from_arrays(headers)
print(df)
这给出了所需的输出:
a1 a2
b1 b2 b1 b2
c1 c2 c3 c1 c2 c3 c1 c2 c3 c1 c2 c3
0 0.9803 0.6223 0.3398 0.1376 0.3197 0.4410 0.9854 0.2557 0.4300 0.2170 0.4303 0.2307
1 0.1125 0.2934 0.8716 0.4591 0.4254 0.1810 0.6816 0.7632 0.7135 0.1945 0.0215 0.1310
2 0.1479 0.3473 0.1396 0.1298 0.9051 0.7637 0.9413 0.0467 0.9106 0.2931 0.0108 0.0220
3 0.6559 0.3842 0.8389 0.4315 0.2748 0.2193 0.9306 0.6496 0.6549 0.0835 0.8225 0.0136
理论上,您还可以设计一个只读取文件一次的解决方案,然后在出现“未命名”的情况下对 header 进行一些操作——但这样的方法是不太可靠(一般情况下你不应该假设 header 格式)。