read_csv MultiIndex DataFrame:第一行为空时出现问题

read_csv a MultiIndex DataFrame: problem when the first row is empty

经过长时间的计算,我终于获得了包含 MultiIndex 列的 DataFrame:

columns = pd.MultiIndex.from_product([[0, 1], [0, 1]])
df = pd.DataFrame(np.ones((2, 4))], columns=columns)
df
Out[14]: 
     0         1     
     0    1    0    1
0  1.0  1.0  1.0  1.0
1  1.0  1.0  1.0  1.0

我现在将它保存到一个 csv 文件中,稍后再读回来没有问题。

df.to_csv("asd.csv")
df = pd.read_csv("asd.csv", header=[0, 1], index_col=[0])
df
Out[15]: 
     0         1     
     0    1    0    1
0  1.0  1.0  1.0  1.0
1  1.0  1.0  1.0  1.0

对第一行填充 NaN 的 DataFrame 重复相同的过程...

columns= pd.MultiIndex.from_product([[0, 1], [0, 1]])
df = pd.DataFrame([np.full(4, np.nan), np.ones(4)], columns=columns)
df
Out[16]: 
     0         1     
     0    1    0    1
0  NaN  NaN  NaN  NaN
1  1.0  1.0  1.0  1.0

... 给出以下意外结果:

df.to_csv("asd.csv")
df = pd.read_csv("asd.csv", header=[0, 1], index_col=[0])
df
Out[17]: 
     0         1     
     0    1    0    1
0                    
1  1.0  1.0  1.0  1.0

检查索引表明应该是第一行的内容实际上被解释为行的名称。

df.index
Out[18]: Int64Index([1], dtype='int64', name='0')

关于如何解决这个问题有什么想法吗?

保存为 csv 时,您可以执行以下操作:

df.to_csv("asd.csv",na_rep='NULL')

这将return以下结果:

Out[9]: 
     0         1     
     0    1    0    1
0  NaN  NaN  NaN  NaN
1  1.0  1.0  1.0  1.0

技巧似乎是首先使用 read_csv 加载 MultiIndex 列,然后在单独的步骤中将第一列设置为索引,最后删除索引名称。

完整的工作流程如下:

# Create df
columns = pd.MultiIndex.from_product([[0, 1], [0, 1]])
df = pd.DataFrame([np.full(4, np.nan), np.ones(4)], columns=columns)
# Save df
df.to_csv("asd.csv")
# Read df, don't specify index columns
df = pd.read_csv("asd.csv", header=[0, 1])
# Set first column as index, replacing the existing one
df.set_index(df.columns[0], inplace=True)
# Erase index names
df.index.names = [None] * df.index.nlevels
df
Out[101]: 
     0         1     
     0    1    0    1
0  NaN  NaN  NaN  NaN
1  1.0  1.0  1.0  1.0