代码之家  ›  专栏  ›  技术社区  ›  fho

如何修复不平衡的列多索引?

  •  3
  • fho  · 技术社区  · 6 年前

    我试着读入几个结构不好的csv文件:

    [empty], A, A, B, B
    time   , X, Y, X, Y
    0.0    , 0, 0, 0, 0
    1.0    , 2, 5, 7, 0
    ...    , ., ., ., .
    

    使用 pandas.read_csv header=[0,1] 参数I可以很好地访问值:

    >>> df = pd.read_csv('file.csv', header=[0,1]'
    >>> df.A.X
    0 0
    1 2
    ...
    

    但是时间头上方的空字段会导致 Unnamed: 0_level_0 级别:

    >>> df.columns
    MultiIndex(levels=[['Unnamed: 0_level_0', 'A', 'B'], ...
    

    有什么方法可以解决这个问题,这样我就可以用 df.Time 再一次?

    编辑

    这是真实数据集的片段:

    ,,Bone,Bone,Bone
    ,,Skeleton1_Hip,Skeleton1_Hip,Skeleton1_Hip
    ,,"1","1","1"
    ,,Rotation,Rotation,Rotation
    Frame,Time,X,Y,Z
    0,0.000000,0.009332,0.999247,0.021044
    1,0.008333,0.009572,0.999217,0.020468
    3,0.016667,0.009871,0.999183,0.019797
    

    (另见: https://gist.github.com/fhaust/25ba612f99420d366f0597b15dbf43e7 更完整的例子)

    阅读途径:

    pd.read_csv(file, skiprows=2, header=[0,1,3,4], index_col=[1])
    

    我真的不在乎 Frame 列,因为它是用行索引隐式给定的。

    1 回复  |  直到 6 年前
        1
  •  1
  •   jezrael    6 年前

    添加参数 index_col 将第一列转换为 index :

    import pandas as pd
    
    temp=u""",A,A,B,B
    time,X,Y,X,Y
    0.0,0,0,0,0
    1.0,2,5,7,0"""
    #after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
    df = pd.read_csv(pd.compat.StringIO(temp), header=[0,1], index_col=[0])
    
    print (df)
          A     B   
    time  X  Y  X  Y
    0.0   0  0  0  0
    1.0   2  5  7  0
    

    或重命名列:

    df = df.rename(columns={'Unnamed: 0_level_0':'val'})
    print (df)
       val  A     B   
      time  X  Y  X  Y
    0  0.0  0  0  0  0
    1  1.0  2  5  7  0