Python 按列值“压缩”两个数据帧

Python 按列值“压缩”两个数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,全部 假设我有一个数据帧,如: df1 = pd.DataFrame({"A": range(6), "key": [0,1]*3}) df1 A key 0 0 0 1 1 1 2 2 0 3 3 1 4 4 0 5 5 1 及 C中的值都是唯一的,键中的值在实际数据集中没有这样的模式 我试图将两者合并到一个生成的数据帧中,在该数据帧中,列C中的值对于列键中的匹配值将只取一次 即 顺序无关紧要,即C中的值不需要按顺序取。这是一个玩

全部

假设我有一个数据帧,如:

df1 = pd.DataFrame({"A": range(6), "key": [0,1]*3})
df1

    A   key
0   0   0
1   1   1
2   2   0
3   3   1
4   4   0
5   5   1

C中的值都是唯一的,键中的值在实际数据集中没有这样的模式

我试图将两者合并到一个生成的数据帧中,在该数据帧中,列C中的值对于列键中的匹配值将只取一次

顺序无关紧要,即C中的值不需要按顺序取。这是一个玩具的例子,我实际上有10把钥匙

我知道我可能会进行外部连接,然后以某种方式删除非唯一的C值。但这可能有点过分,因为实际数据集中的行太多了~30k


提前谢谢

您可以添加要在联接中使用的额外列:

df1['order'] = df1.groupby('key').cumcount()
df2['order'] = df2.groupby('key').cumcount()

# If you want to match on random order:
# df2['order'] = df2.sample(frac=1).groupby('key').cumcount()

df1.merge(df2, on=['key', 'order'])
结果:

   A  key  order     C
0  0    0      0  k0-0
1  1    1      0  k1-0
2  2    0      1  k0-1
3  3    1      1  k1-1
4  4    0      2  k0-2
5  5    1      2  k1-2

您可以构建一个迭代器字典,然后根据“键”调用相应的迭代器


是我错了,还是您期望的输出与您的输入不匹配?我在输出中看到'k1-3',在df2中没有看到'k1-3'。很抱歉,无意中改变了顺序,现已修复。
df1['order'] = df1.groupby('key').cumcount()
df2['order'] = df2.groupby('key').cumcount()

# If you want to match on random order:
# df2['order'] = df2.sample(frac=1).groupby('key').cumcount()

df1.merge(df2, on=['key', 'order'])
   A  key  order     C
0  0    0      0  k0-0
1  1    1      0  k1-0
2  2    0      1  k0-1
3  3    1      1  k1-1
4  4    0      2  k0-2
5  5    1      2  k1-2
g = {k: iter(v) for k, v in df2.groupby('key').C}
df1.assign(C=[next(g[x]) for x in df1.key])

   A  key     C
0  0    0  k0-0
1  1    1  k1-0
2  2    0  k0-1
3  3    1  k1-1
4  4    0  k0-2
5  5    1  k1-2