首页 > 解决方案 > 将一对列表转换为可能的最小 DataFrame 表示?

问题描述

我有一个配对项目列表,我想将它们转换成一个熊猫数据框,其中每个配对项目在同一列中共享相同的数字。所以是这样的:

[('A', 'B'),
('A', 'C'),
('B', 'D')]

被转换成...

  0  1
A 2  1
B 3  1
C 2  0
D 3  0

因此,这些列按编码对数的递减顺序排列,并且它使用尽可能少的列。

有没有这样的算法,最好是 numpy 或 pandas 的算法?到目前为止,我一直无法在 Google 上找到任何东西,但是自从我学习线性代数以来已经有一段时间了,所以我可能只是忘记了要使用的正确术语。

我创建了以下(错误的)代码来创建 DataFrame,但由于某种原因,它创建的列数与对数一样多,这不是我想要完成的。

def create_df(ps):
    df = pd.DataFrame(index=np.unique(ps))
    cnt = 1
    for p in ps:
        col = 0
        a, b = p
        while col in df.columns and (df.at[a, col] != 0 or df.at[b, col] != 0):
            col += 1
        df.loc[a, col] = cnt
        df.loc[b, col] = cnt
        cnt += 1
    return df

这样做的最终目标是将输出集成到数据管道中,这样我就可以在 pandas 中使用 groupby 来计算对的统计信息。因此,每一对都必须在同一列中定义,如示例中所示。

标签: pythonpandasnumpylinear-algebra

解决方案


这更像是pivot我们做之后的一个问题melt

s=pd.DataFrame(l).reset_index().melt('index')
s=s.assign(Col=s.groupby('value').cumcount()).pivot('value','Col','index').\
    add(1).fillna(0)
s
Out[62]: 
Col      0    1
value          
A      1.0  2.0
B      3.0  1.0
C      2.0  0.0
D      3.0  0.0

推荐阅读