【问题标题】:Transforming a 'repetitive' 2D-array into a matrix using python使用 python 将“重复”二维数组转换为矩阵
【发布时间】:2016-12-14 07:51:27
【问题描述】:

我有一个文本文件,其中包含以下形式的信息:

A  0
B  1
C  4
D  0
E  1
A  0
B  0
C  2
D  1
E  1
A  1
B  0
C  2
D  0
E  0
...

请注意,不计算 ABCDE 循环的总数(此处仅显示 3 个)是未知的。 我想使用 Python 将其转换为具有以下形式的矩阵:

A  0 0 1 ...
B  1 0 0 ...
C  4 2 2 ...
D  0 1 0 ...
E  1 1 0 ...

我不确定进行这种转换的最佳方法是什么,是否有人作为 python 脚本执行此操作? Numpy 或 Pandas 中是否有任何功能可以轻松做到这一点?还是我应该在没有 Numpy 或 Pandas 的情况下这样做?

非常感谢您的帮助!

【问题讨论】:

    标签: python pandas numpy matrix transformation


    【解决方案1】:

    熊猫解决方案:

    import pandas as pd
    from pandas.compat import StringIO
    
    temp=u"""
    A  0
    B  1
    C  4
    D  0
    E  1
    A  0
    B  0
    C  2
    D  1
    E  1
    A  1
    B  0
    C  2
    D  0
    E  0"""
    #after testing replace StringIO(temp) to filename
    df = pd.read_csv(StringIO(temp), sep="\s+", header=None)
    
    print (df)
        0  1
    0   A  0
    1   B  1
    2   C  4
    3   D  0
    4   E  1
    5   A  0
    6   B  0
    7   C  2
    8   D  1
    9   E  1
    10  A  1
    11  B  0
    12  C  2
    13  D  0
    14  E  0
    
    df = pd.pivot(index=df[0], columns=df.groupby(0).cumcount(), values=df[1])
    print (df)
       0  1  2
    0         
    A  0  0  1
    B  1  0  0
    C  4  2  2
    D  0  1  0
    E  1  1  0
    

    【讨论】:

    • 非常感谢!这正是我所需要的!
    【解决方案2】:

    选项 1
    添加索引级别和unstack

    s.index = [s.index, np.arange(len(s)) // 5]
    s.unstack()
    

    选项 2
    重构

    pd.DataFrame(s.values.reshape(5, -1), s.index[:5])
    


    设置
    我假设一个以索引为第一列的系列。

    import pandas as pd
    from pandas.compat import StringIO
    
    txt = """A  0
    B  1
    C  4
    D  0
    E  1
    A  0
    B  0
    C  2
    D  1
    E  1
    A  1
    B  0
    C  2
    D  0
    E  0"""
    s = pd.read_csv(StringIO(txt), sep="\s+", header=None, index_col=0, squeeze=True)
    

    【讨论】:

    • 非常感谢。对于这种特殊情况,我更喜欢@jezrael 解决方案,因为我不必指定矩阵中的行数,但最好有一些替代方法以防万一。