全
假设我有一个数据帧,如下:
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和
df2 = pd.DataFrame({"C": ["k0-"+str(x) for x in range(3)] + ["k1-"+str(x) for x in range(3)] , "key": [0]*3 + [1]*3}) k0-1
df2
C key
0 k0-0 0
1 k0-1 0
2 k0-2 0
3 k1-0 1
4 k1-1 1
5 k1-2 1C中的值都是唯一的,而key中的值在实际数据集中没有这样的模式。
我正在尝试将这两个值与结果数据帧合并,其中C列中的值将对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顺序并不重要,也就是说,C中的值不需要按顺序取。这是一个玩具示例,我在现实中有大约10个钥匙。
我知道我可以做一个外连接,然后以某种方式删除不唯一的C值。但这可能有点夸张,因为实际数据集中有太多的行(约30k)。
提前感谢!
发布于 2020-05-01 00:12:39
您可以添加要在联接中使用的额外列:
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发布于 2020-05-01 00:46:05
您可以构建迭代器字典,并根据'key'在适当的迭代器上调用next。
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-2https://stackoverflow.com/questions/61527569
复制相似问题