【问题标题】:How to add a MultiIndex after loading csv data into a pandas dataframe?将 csv 数据加载到 pandas 数据框后如何添加 MultiIndex?
【发布时间】:2019-03-27 21:32:24
【问题描述】:

在将 csv 数据加载到现有 pandas 数据帧后,我正在尝试向其中添加额外的索引行。

假设我这样加载数据:

columns = ['Relative_Pressure','Volume_STP']
df = pd.read_csv(StringIO(contents), skiprows=4, delim_whitespace=True,index_col=False,header=None)
df.columns = columns

其中contents 是 csv 格式的字符串。生成的 DataFrame 可能如下所示:

为了清楚起见,我现在想向 DataFrame 添加额外的索引行,如 here 所示:

但是,在链接中,这些多个索引行是在创建 DataFrame 时生成的。我想添加例如unitdescr 的行到列。

我该怎么做?

【问题讨论】:

  • 您的链接提供的解决方案看起来很巧妙,而且有点过分。将多索引用于元数据存储对性能和未来更新的次优可维护性具有重要影响。最简单的解决方案是为数据提供自述文件。更好的解决方案是创建一个子类,但只添加一个带有 print_metadata 的metadata 属性来打印它。您可以选择覆盖 __str____unicode__ 以首先打印元数据,然后是 super().__str__super().__unicode__。但是,如果您要分发包含数据的库,则给他们提供文本 README 会更容易。

标签: python pandas dataframe


【解决方案1】:

您可以通过专门创建索引然后将其分配给列而不是读取数据来在列上创建MultiIndex

我将使用link you provided 中的示例。第一种方法是在制作数据框时创建 MultiIndex:

df = pd.DataFrame({('A',1,'desc A'):[1,2,3],('B',2,'desc B'):[4,5,6]})
df.columns.names=['NAME','LENGTH','DESCRIPTION']
df

NAME             A      B
LENGTH           1      2
DESCRIPTION desc A desc B
0                1      4
1                2      5
2                3      6

如上所述,这不是你所追求的。相反,您可以制作数据框(例如,从您的文件中),然后从一组列表中制作 MultiIndex,然后将其分配给列:

df = pd.DataFrame({'desc A':[1,2,3], 'desc B':[4,5,6]})

# Output
   desc A  desc B
0       1       4
1       2       5
2       3       6

# Create a multiindex from lists
index = pd.MultiIndex.from_arrays((['A', 'B'],  [1, 2], ['desc A', 'desc B']))

# Assign to the columns
df.columns = index


# Output
       A      B
       1      2
  desc A desc B
0      1      4
1      2      5
2      3      6


# Name the columns
df.columns.names = ['NAME','LENGTH','DESCRIPTION']

# Output
NAME             A      B
LENGTH           1      2
DESCRIPTION desc A desc B
0                1      4
1                2      5
2                3      6

还有其他方法可以构造MultiIndex,例如from_tuplesfrom_product。您可以阅读有关Multi Indexes in the documentation 的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-06
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2016-09-19
    相关资源
    最近更新 更多