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
经过长时间的计算,我终于获得了包含 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