【问题标题】:How to do Multi-Column from_tuples?如何做多列from_tuples?
【发布时间】:2016-10-16 13:44:59
【问题描述】:

我知道如何使用pd.MultiIndex.from_tuples() 来改变类似的东西

       Value
(A,a)  1
(B,a)  2
(B,b)  3

进入

                Value
Caps Lower      
A    a          1
B    a          2
B    b          3

但是如何更改表单中的列元组

       (A, a)  (A, b) (B,a)  (B,b)
index
1      1       2      2      3
2      2       3      3      2
3      3       4      4      1

进入表格

 Caps         A              B
 Lower        a       b      a      b
 index
 1            1       2      2      3
 2            2       3      3      2
 3            3       4      4      1

非常感谢。


编辑: 我有一个元组列标题的原因是,当我将具有单级列的 DataFrame 加入具有多级列的 DataFrame 时,它​​会将多列转换为元组字符串格式,并将单个级别保留为单个字符串。


编辑 2 - 替代解决方案: 如前所述,这里的问题是通过具有不同列级别大小的 join 引起的。这意味着多列被简化为字符串元组。为了解决这个问题,在加入之前,我使用df.columns = [('col_level_0','col_level_1','col_level_2')] 作为我希望加入的 DataFrame。

【问题讨论】:

    标签: pandas multiple-columns multi-index columnname


    【解决方案1】:

    pd.MultiIndex.from_tuples 的结果直接分配给columns,并传入您现有的列:

    In [186]:
    l=[('A', 'a'),  ('A', 'b'), ('B','a'),  ('B','b')]
    df = pd.DataFrame(np.random.randn(5,4), columns = l)
    df
    
    Out[186]:
         (A, a)    (A, b)    (B, a)    (B, b)
    0 -0.876353  0.553742  1.631858 -0.561309
    1  0.463058 -0.455014 -0.491336 -1.436059
    2  0.337810  0.233624 -0.571749 -2.259763
    3  1.073057 -0.475894  0.999643 -0.379743
    4  0.441800  0.311202 -0.191552  0.291268
    
    In [187]:    
    df.columns = pd.MultiIndex.from_tuples(df.columns, names=['Caps','Lower'])
    df
    
    Out[187]:
    Caps          A                   B          
    Lower         a         b         a         b
    0     -0.876353  0.553742  1.631858 -0.561309
    1      0.463058 -0.455014 -0.491336 -1.436059
    2      0.337810  0.233624 -0.571749 -2.259763
    3      1.073057 -0.475894  0.999643 -0.379743
    4      0.441800  0.311202 -0.191552  0.291268
    

    请注意,您可以直接分配给columns 属性的names 属性,如下所示:

    df.columns.names = ['Caps','Lower']
    

    不要与name 属性混淆

    【讨论】:

    • 好吧,也许我不明白如何将它用于索引,否则我会意识到所需的细微变化。现在我想我对两者的理解都更好了!谢谢。
    • @Edchum,我认为在函数from_tuples - see revision 中使用参数复制我的解决方案是不公平的。但这取决于你。祝你好运!
    • 将名称属性设置为附加步骤对我来说似乎是多余的,尽管您认为我并没有复制您的解决方案,而且如果您忽略命名步骤,这两个答案之间几乎没有区别基本点是 OP 想要将列元组名称转换为分层索引
    • 是的,Readability counts.。美好的一天!
    【解决方案2】:

    另一种解决方案是使用MultiIndex.from_tuples 和参数names

    import pandas as pd
    
    df = pd.DataFrame({'Value': [1,2,3]}, index=[('A','a'),('B','a'),('B','b')])
    print (df)
            Value
    (A, a)      1
    (B, a)      2
    (B, b)      3
    
    df.index = pd.MultiIndex.from_tuples(df.index, names=['Caps','Lower'])
    print (df)
                Value
    Caps Lower       
    A    a          1
    B    a          2
         b          3
    

    这同样适用于columns,参见Edchum's answer

    df.columns= pd.MultiIndex.from_tuples(df.columns, names=['Caps','Lower'])
    

    【讨论】:

    • 是的,我没有看到我需要将其分配给 df.columns 而不是 df.index 但这将有助于其他尚未看到 df.index = pd.MultiIndex.from_tuples(df.index) 的人等等。谢谢。
    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    相关资源
    最近更新 更多