python - 通过将列中的值与另一列中的列表匹配来连接数据帧
问题描述
我有 2 个具有以下格式的数据框:
df1
ID age
[111, 222, 333] 15
[444] 9
[555, 666, 777, 888] 8
df2
ID school
222 A
777 B
我需要通过匹配 ID 来连接它们以获得以下结果
df1_ID age df2_ID school
[111, 222, 333] 15 222 A
[555, 666, 777, 888] 8 777 B
df1_ID 可能是最多 10 个 ID 的列表,我想不出一种有效连接数据帧的方法。你会如何处理这个问题?谢谢。
解决方案
如果想要有效地处理数据,就必须改变格式,因为list
在 pandas 中使用 s 显然很慢。
from itertools import chain
df11 = pd.DataFrame({
'ID' : list(chain.from_iterable(df1['ID'].tolist())),
'age' : df1['age'].values.repeat(df1['ID'].str.len())
})
print (df11)
ID age
0 111 15
1 222 15
2 333 15
3 444 9
4 555 8
5 666 8
6 777 8
7 888 8
df12 = df11.merge(df2, on='ID', how='left')
print (df12)
ID age school
0 111 15 NaN
1 222 15 A
2 333 15 NaN
3 444 9 NaN
4 555 8 NaN
5 666 8 NaN
6 777 8 B
7 888 8 NaN
推荐阅读
- c++ - 无法在 C++ 头文件中创建数组?
- linux - 错误:无法检索存储库的存储库元数据 (repomd.xml):base。请验证其路径并重试
- swift - 如果使用了 setter 和 getter,则 Swift 解码不起作用
- c++ - 在 OpenGL 中编程特定的 3d(星形)模型?
- docker - 让 Ember 前端和 Flask 后端通过单独的 Docker 容器进行通信
- python - GAN RNN 生成器:AttributeError:“NoneType”对象没有属性“_inbound_nodes”
- git - Git 共享来自 repo 的文件子集,不保留 repo 中其他文件的信息
- c++ - c++ 模板化抽象基类数组,不违反严格别名规则
- sql-server - Zend DB Framework3 SQL Server 选择限制
- nginx - 使用参数重写 Nginx URL(在问号之后)