Pandas 对 DataFrame 中的列 MultiIndex 使用多行

Posted

技术标签:

【中文标题】Pandas 对 DataFrame 中的列 MultiIndex 使用多行【英文标题】:Pandas use several rows for a column MultiIndex in a DataFrame 【发布时间】:2019-10-28 23:41:44 【问题描述】:

当您在 pandas 中加载 CSV 时,您可以轻松指定用作列索引的行数,如下所示:

import pandas
from six import StringIO
df = """a | X | X  | Y | Y  | Z  | Z
        b | C | N  | C | N  | C  | N
        c | i | i  | i | j  | j  | j
        d | 3 | 10 | 4 | 98 | 81 | 0"""
df = StringIO(df.replace(' ',''))
df = pandas.read_csv(df, sep="|", header=[0,1,2])

>>> df
   a  X      Y       Z
   b  C   N  C   N   C  N
   c  i   i  i   j   j  j
0  d  3  10  4  98  81  0

但是如何从内存中的 Dataframe 产生相同的结果呢?您如何简单地指定列索引应使用哪一组行?

当然不用经历这个hack:

>>> df

   0  1   2  3   4   5  6
0  a  X   X  Y   Y   Z  Z
1  b  C   N  C   N   C  N
2  c  i   i  i   j   j  j
3  d  3  10  4  98  81  0

path = '~/test/temp.csv'
df.to_csv(path, header=None, index=None)
df = pandas.read_csv(path, header=[0,1,2])

甚至是这个 hack:

>>> df

   0  1   2  3   4   5  6
0  a  X   X  Y   Y   Z  Z
1  b  C   N  C   N   C  N
2  c  i   i  i   j   j  j
3  d  3  10  4  98  81  0

df = df.transpose().set_index([0,1,2]).transpose()

我尝试使用此方法,但它不接受axis 参数:

df.set_index(['a', 'b', 'c'], axis=1)

【问题讨论】:

【参考方案1】:

您的替代解决方案应该有所改进:

df = df.T.set_index([0,1,2]).T

没有转置的另一种解决方案:

df.columns = pd.MultiIndex.from_tuples(df.iloc[:3].apply(tuple))
df = df.iloc[3:].reset_index(drop=True)
print (df)
   a  X      Y       Z   
   b  C   N  C   N   C  N
   c  i   i  i   j   j  j
0  d  3  10  4  98  81  0

【讨论】:

以上是关于Pandas 对 DataFrame 中的列 MultiIndex 使用多行的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:DataFrame数据的更改插入新增的列和行

将 Pandas DataFrame 中的列组合到 DataFrame 中的列表列

迭代 Pandas Dataframe 中的列和行

检测 pandas.DataFrame 中的列是不是是分类的有啥好的启发式方法?

如何将 Pandas 系列中的多个字典键转换为 DataFrame 中的列?

如何使用 Pandas 从 DataFrame 或 np.array 中的列条目创建字典