扩展转换DataFrame:实现两两用户byte array差异双向对比
解决用户饮食喜好对比问题
步骤1:构造示例DataFrame
假设我们的原始饮食喜好数据如下(1代表喜欢,0代表不喜欢):
import pandas as pd data = { '汉堡': [1, 0, 1], '披萨': [0, 1, 1], '沙拉': [1, 1, 0], '寿司': [0, 0, 1] } df = pd.DataFrame(data, index=['tom', 'jenny', 'bob'])
原始DataFrame输出:
汉堡 披萨 沙拉 寿司 tom 1 0 1 0 jenny 0 1 1 0 bob 1 1 0 1
步骤2:生成双向用户对并计算差异
我们需要生成所有双向用户组合(如tom-jenny和jenny-tom均保留),再逐位对比饮食喜好的差异:
# 获取所有用户列表 users = df.index.tolist() # 生成所有非自身的双向用户对 user_pairs = [(u1, u2) for u1 in users for u2 in users if u1 != u2] # 计算每对用户的差异标记 diff_results = [] for u1, u2 in user_pairs: # 对应位置值不同标记为1,相同标记为0 diff = (df.loc[u1] != df.loc[u2]).astype(int) diff_results.append(diff) # 构造两种格式的结果DataFrame # 格式1:MultiIndex索引 result_multi = pd.DataFrame( diff_results, index=pd.MultiIndex.from_tuples(user_pairs, names=['用户A', '用户B']) ) # 格式2:分两列展示用户对 result_cols = pd.DataFrame(diff_results) result_cols[['用户A', '用户B']] = user_pairs # 调整列顺序,把用户对列放在前面 result_cols = result_cols[['用户A', '用户B'] + df.columns.tolist()]
步骤3:查看输出结果
MultiIndex格式输出
汉堡 披萨 沙拉 寿司 用户A 用户B tom jenny 1 1 0 0 bob 0 1 1 1 jenny tom 1 1 0 0 bob 1 0 1 1 bob tom 0 1 1 1 jenny 1 0 1 1
分两列展示用户对格式输出
用户A 用户B 汉堡 披萨 沙拉 寿司 0 tom jenny 1 1 0 0 1 tom bob 0 1 1 1 2 jenny tom 1 1 0 0 3 jenny bob 1 0 1 1 4 bob tom 0 1 1 1 5 bob jenny 1 0 1 1
关键说明
- 利用
df.loc[u1] != df.loc[u2]直接对比两个用户的饮食喜好布尔值,再通过astype(int)将布尔值转为1/0,快速得到差异标记。 - 双重循环遍历用户列表生成双向对,排除自身对比的情况,确保保留所有双向对比结果。
内容的提问来源于stack exchange,提问作者Tarquinius
相关产品推荐
相关产品推荐

