python - Pandas 分层列和 csv 函数

标签 python pandas

是否有可能以尊重分层列结构的方式通过 csv 来回传输 DataFrame?换句话说,如果我有以下 DataFrame:

>>> cols = pd.MultiIndex.from_arrays([["foo", "foo", "bar", "bar"],
                                      ["a", "b", "c", "d"]])
>>> df = pd.DataFrame(np.random.randn(5, 4), index=range(5), columns=cols)

执行以下操作失败:

>>> df.to_csv("df.csv", index_label="index")
>>> df_new = pd.read_csv("df.csv", index_col="index")
>>> assert df.columns == df_new.columns

我是否遗漏了 csv 保存/读取步骤中的某些选项?

最佳答案

在特殊情况下,您有一个列式 MultiIndex,但索引很简单,您可以转置 DataFrame 并使用 index_labelindex_col,如下所示:

import numpy as np
import pandas as pd

cols = pd.MultiIndex.from_arrays([["foo", "foo", "bar", "bar"],
                                  ["a", "b", "c", "d"]])

df = pd.DataFrame(np.random.randn(5, 4), index=range(5), columns=cols)

(df.T).to_csv('/tmp/df.csv', index_label=['first','second'])
df_new = pd.read_csv('/tmp/df.csv', index_col=['first','second']).T
assert np.all(df.columns.values == df_new.columns.values)

但不幸的是,这引出了一个问题,如果索引和列都是多索引该怎么办?


这是一个 hacky 解决方法:

import numpy as np
import pandas as pd
import ast

cols = pd.MultiIndex.from_arrays([["foo", "foo", "bar", "bar"],
                                  ["a", "b", "c", "d"]])

df = pd.DataFrame(np.random.randn(5, 4), index=range(5), columns=cols)
print(df)

df.to_csv('/tmp/df.csv', index_label='index')
df_new = pd.read_csv('/tmp/df.csv', index_col='index')

columns = pd.MultiIndex.from_tuples([ast.literal_eval(item) for item in df_new.columns])
df_new.columns = columns
df_new.index.name = None
print(df_new)
assert np.all(df.columns.values == df_new.columns.values)

当然,如果你只是想将DataFrame存储在任何格式的文件中,那么df.savepd.load提供了一个更愉快的解决方案:

import numpy as np
import pandas as pd

cols = pd.MultiIndex.from_arrays([["foo", "foo", "bar", "bar"],
                                  ["a", "b", "c", "d"]])

df = pd.DataFrame(np.random.randn(5, 4), index=range(5), columns=cols)

df.save('/tmp/df.df')
df_new = pd.load('/tmp/df.df')
assert np.all(df.columns.values == df_new.columns.values)

关于python - Pandas 分层列和 csv 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16389097/

相关文章:

python - 如何在拖放时隐藏窗口中的光标(可能是python,或其他语言)

python - 如果列中的元素全部出现在列表中并且 pandas 中没有其他内容,则 Oly 子集分组

python - 如何将两列数组转换为具有出现次数的矩阵?

python - 如何从 Pandas MultiIndex 制作 Seaborn 线图?

python-3.x - 带有正则表达式的 Pandas 系列上的 rsplit 不起作用

python - 将 url 与 urlunparse 组合

python - 使用 getopt/optparse 为一个选项处理多个值?

python - 我可以仅对多个数据类型的 DataFrame 中的数值数据使用 K-Means 吗?

python - 将多个值添加到 python 中的字典键?

python - 如何使用多维交叉表/数据透视表