python - pandas - 在包含元组的列上合并
问题描述
我有一个这样的df:
>>> df1
col_1 col_2 labels
0 aaa abc (71020,)
1 ddd ghi (99213, 99287,)
2 bbb cde (77085,)
3 eee ijk (99233, 71020, 36415,)
和另一个像这样的df:
>>> df2
71020 77085 36415 99213 99287 99233 labels_mg
0 1 0 1 0 0 1 (99233, 71020, 36415,)
1 1 0 0 0 0 0 (71020,)
2 0 0 0 1 1 0 (99213, 99287)
3 0 1 0 0 0 0 (77085,)
并希望通过右连接 2 个 dfs 来生成一个 df,如下所示:
col_1 col_2 labels 71020 77085 36415 99213 99287 99233
0 aaa abc (71020,) 1 0 0 0 0 0
1 ddd ghi (99213, 99287,) 0 0 0 1 1 0
2 bbb cde (77085,) 0 1 0 0 0 0
3 eee ijk (99233, 71020, 36415,) 1 0 1 0 0 1
这是我尝试过的,但这会生成一个包含 0 行的空数据框,但包含所有列名。
pd.merge(left=df1, right=df2, left_on=['labels'], right_on=['labels_mg'])
元组在两个 dfs 中都被解析为元组。从文件读取到 pandas dfs 后,我已经完成ast.literal_eval
了这两个 df 的列。两个 dfs 也不共享共同索引。
我的 df 尺寸是 (528840, 207) 和 (528840, 5)。我如何有效地做到这一点?
解决方案
问题一元组是整数,二是由字符串填充,解决方案将它们转换为整数,如:
import ast
df1['labels'] = df1['labels'].apply(ast.literal_eval)
df2['labels_mg'] = df2['labels_mg'].apply(lambda x: tuple([int(y) for y in ast.literal_eval(x)]))
df = pd.merge(left=df1, right=df2, left_on=['labels'], right_on=['labels_mg'])
print (df)
col_1 col_2 labels 71020 77085 36415 99213 99287 \
0 aaa abc (71020,) 1 0 0 0 0
1 ddd ghi (99213, 99287) 0 0 0 1 1
2 bbb cde (77085,) 0 1 0 0 0
3 eee ijk (99233, 71020, 36415) 1 0 1 0 0
99233 labels_mg
0 0 (71020,)
1 0 (99213, 99287)
2 0 (77085,)
3 1 (99233, 71020, 36415)
推荐阅读
- c# - OWIN web api CancellationToken 未被调用
- ios - 如何实现 SwiftUI 拉刷新获取新的网络数据?
- python - 使用分类数据定义列表后 pd.crosstab 不起作用
- sql - 如何在 oracle sql 中将对象类型数据用于 in 子句?
- c - 创建和销毁线程时内存泄漏
- c# - C#如何在一个Datagridview中显示多个数据库表?
- javascript - 为什么 couchbase-sync-gateway 会返回“将 Rev 添加到 RevTree 失败”?
- c# - 如何动态排序结果
- c# - Docker中的Net Core应用程序“不支持LocalDB”而不使用本地数据库
- javascript - 如何根据上一个下拉列表值的选择启用/禁用第二个下拉列表值