首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按列值“压缩”两个数据帧

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

Stack Overflow用户
提问于 2020-04-30 23:55:33
回答 2查看 44关注 0票数 2

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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    1

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

我正在尝试将这两个值与结果数据帧合并,其中C列中的值将对key列中的匹配值恰好取一次。

也就是说。

代码语言:javascript
复制
    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)。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-01 00:12:39

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

代码语言:javascript
复制
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'])

结果:

代码语言:javascript
复制
   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
票数 2
EN

Stack Overflow用户

发布于 2020-05-01 00:46:05

您可以构建迭代器字典,并根据'key'在适当的迭代器上调用next

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61527569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档