例如,假设我有两列A和B
A B
1 2
2 3
3 4
4 5
而且,我想将上述pandas数据框转换为以下示例。我尝试了merge
,但是却得到了重复的值。
A_X B_X A_Y B_Y
1 2 2 3
1 2 3 4
1 2 4 5
2 3 3 4
2 3 4 5
3 4 4 5
答案 0 :(得分:3)
IIUC,您可以尝试:
df.assign(key=1).merge(df.assign(key=1), on='key')\
.query('A_x != A_y and B_x != B_y').drop('key', axis=1)
输出:
A_x B_x A_y B_y
1 1 2 2 3
2 1 2 3 4
3 1 2 4 5
4 2 3 1 2
6 2 3 3 4
7 2 3 4 5
8 3 4 1 2
9 3 4 2 3
11 3 4 4 5
12 4 5 1 2
13 4 5 2 3
14 4 5 3 4
或者过滤掉进一步的使用不平等:
df.assign(key=1).merge(df.assign(key=1), on='key')\
.query('A_x < A_y and B_x < B_y').drop('key', axis=1)
输出:
A_x B_x A_y B_y
1 1 2 2 3
2 1 2 3 4
3 1 2 4 5
6 2 3 3 4
7 2 3 4 5
11 3 4 4 5
详细信息:
assign
一个伪密钥,并使用merge
进行“自连接”以创建笛卡尔积
然后使用query
过滤结果并使用drop
键。