python - 将一对列表转换为可能的最小 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 来计算对的统计信息。因此,每一对都必须在同一列中定义,如示例中所示。
解决方案
这更像是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
推荐阅读
- java - 在 Java Swing 中为 JFrame 添加背景
- lag - 如何更改项目监视器中的渲染速度?
- php - 为什么在我实时上传时插入语句不起作用?但是当在 localhost 上完美运行时
- javascript - 无法读取未定义的属性“包含” - 快速路由
- angular - Angular 中的二进制输入验证器(TypeScript)
- ssms - SQL Server Management Studio 安装期间出现致命错误 0x80070643
- robotframework - 如何将查询结果打印到控制台 | 机器人框架
- php - PHP for 循环仅每两行有效
- statistics - 如何在 Julia 中操作数据框时使用条件
- reactjs - 使用带有 React Js 的“Unstated”从 API 端点获取数据