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