python - 如何从 ASCII 文件写入/读取带有 MultiIndex 的 Pandas DataFrame?

标签 python pandas

我希望能够为行和列索引创建一个带有 MultiIndexes 的 Pandas DataFrame,并从 ASCII 文本文件中读取它。我的数据如下:

col_indx = MultiIndex.from_tuples([('A',  'B',  'C'), ('A',  'B',  'C2'), ('A',  'B',  'C3'), 
                                   ('A',  'B2', 'C'), ('A',  'B2', 'C2'), ('A',  'B2', 'C3'), 
                                   ('A',  'B3', 'C'), ('A',  'B3', 'C2'), ('A',  'B3', 'C3'), 
                                   ('A2', 'B',  'C'), ('A2', 'B',  'C2'), ('A2', 'B',  'C3'), 
                                   ('A2', 'B2', 'C'), ('A2', 'B2', 'C2'), ('A2', 'B2', 'C3'), 
                                   ('A2', 'B3', 'C'), ('A2', 'B3', 'C2'), ('A2', 'B3', 'C3')], 
                                   names=['one','two','three']) 
row_indx = MultiIndex.from_tuples([(0,  'North', 'M'), 
                                   (1,  'East',  'F'), 
                                   (2,  'West',  'M'), 
                                   (3,  'South', 'M'), 
                                   (4,  'South', 'F'), 
                                   (5,  'West',  'F'), 
                                   (6,  'North', 'M'), 
                                   (7,  'North', 'M'), 
                                   (8,  'East',  'F'), 
                                   (9,  'South', 'M')], 
                                   names=['n', 'location', 'sex'])
size=len(row_indx), len(col_indx)
data = np.random.randint(0,10, size)
df = DataFrame(data, index=row_indx, columns=col_indx)
print df

我试过 df.to_csv()read_csv() 但它们不保留索引。

我正在考虑使用额外的分隔符创建一种新格式。比如用一行----------------来标记列索引的结束,用|来标记行索引的末尾。所以它看起来像这样:

one            | A   A   A   A   A   A   A   A   A  A2  A2  A2  A2  A2  A2  A2  A2  A2
two            | B   B   B  B2  B2  B2  B3  B3  B3   B   B   B  B2  B2  B2  B3  B3  B3
three          | C  C2  C3   C  C2  C3   C  C2  C3   C  C2  C3   C  C2  C3   C  C2  C3
--------------------------------------------------------------------------------------
n location sex :                                                                      
0 North    M   | 2   3   9   1   0   6   5   9   5   9   4   4   0   9   6   2   6   1
1 East     F   | 6   2   9   2   7   0   0   3   7   4   8   1   3   2   1   7   7   5
2 West     M   | 5   8   9   7   6   0   3   0   2   5   0   3   9   6   7   3   4   9
3 South    M   | 6   2   3   6   4   0   4   0   1   9   3   6   2   1   0   6   9   3
4 South    F   | 9   6   0   0   6   1   7   0   8   1   7   6   2   0   8   1   5   3
5 West     F   | 7   9   7   8   2   0   4   3   8   9   0   3   4   9   2   5   1   7
6 North    M   | 3   3   5   7   9   4   2   6   3   2   7   5   5   5   6   4   2   9
7 North    M   | 7   4   8   6   8   4   5   7   9   0   2   9   1   9   7   9   5   6
8 East     F   | 1   6   5   3   6   4   6   9   6   9   2   4   2   9   8   4   2   4
9 South    M   | 9   6   6   1   3   1   3   5   7   4   8   6   7   7   8   9   2   3

Pandas 是否有办法使用 MultiIndexes 将 DataFrame 写入/读取 ASCII 文件?

最佳答案

不确定您使用的是哪个版本的 pandas,但使用 0.7.3 您可以将 DataFrame 导出到 TSV 文件并通过以下操作保留索引:

df.to_csv('mydf.tsv', sep='\t')

您需要导出为 TSV 而不是 CSV 的原因是列标题中包含 , 字符。这应该可以解决您问题的第一部分。

第二部分变得有点棘手,因为据我所知,您需要事先了解您希望 DataFrame 包含的内容。特别是,您需要了解:

  1. TSV 上的哪些列代表 MultiIndex
  2. 并且其余列也应转换为 MultiIndex

为了说明这一点,让我们将上面保存的 TSV 文件回读到新的 DataFrame 中:

In [1]: t_df = read_table('mydf.tsv', index_col=[0,1,2])
In [2]: all(t_df.index == df.index)
Out[2]: True

因此我们设法将 mydf.tsv 读入一个 DataFrame,它与原始 df 具有相同的行索引。但是:

In [3]: all(t_df.columns == df.columns)
Out[3]: False

这里的原因是因为 pandas(据我所知)无法将标题行正确解析为 MultiIndex。正如我上面提到的,如果您知道您的 TSV 文件头代表一个 MultiIndex,那么您可以执行以下操作来解决此问题:

In [4]: from ast import literal_eval
In [5]: t_df.columns = MultiIndex.from_tuples(t_df.columns.map(literal_eval).tolist(), 
                                              names=['one','two','three'])
In [6]: all(t_df.columns == df.columns)
Out[6]: True

关于python - 如何从 ASCII 文件写入/读取带有 MultiIndex 的 Pandas DataFrame?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11041411/

相关文章:

python - 是否可以使用基于类的 View 而不是基于函数的 View wagtail?

python - Pandas 上的 Pip 安装失败?

python - tf.reduce_sum 和 keras.backend.sum 不减少维度

python - 匹配 DateTimeIndex 指定容差范围内的 2 个数据帧,同时保留唯一标识符

python - Pandas 数据框 CSV 减少磁盘大小

python - DataFrame:如果单元格中存在值,则将值复制到其下方的单元格

python - 无法使用 BeautifulSoup 抓取嵌套 html

python - Pandas :列的指数平滑函数

python - 贝叶斯优化应用于 CatBoost

python - pandas/xlsxwriter writer.close() 没有完全关闭excel文件