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 中的列组合到 DataFrame 中的列表列
检测 pandas.DataFrame 中的列是不是是分类的有啥好的启发式方法?