如何从受另一个约束的数据库中提取一列数据

2024-04-20 11:35:30 发布

您现在位置:Python中文网/ 问答频道 /正文

这是在python2中完成的,我使用的是Pandas。虽然我很想用SQL来实现这一点,这可能会让我的生活更轻松,但这不是一个选择

我有两个数据帧,x和y。Dataframe x有一列“BuyerNames”,y有一列“Buyers”,它们都包含一列“Section”,以及其他共享列。“x(买方名称)”和“y(买方名称)”中的条目属于同一组,共享列中的数据通常是一致的。 我想创建一个数据帧,它是y的子集,称为y*,这样,对于具有相应索引的行,“BuyerNames”的值等于“Buyers”的值。此数据帧的长度相同,不满足此条件的条目包含NaN条目

我正在创建第三个数据帧z,它具有x和y列的并集。我的最后一个目标是用y中包含的'Section'的条目填充z,保留索引

我对数据库非常陌生,因此对可能非常简单的内容的描述可能非常混乱。如何有效地实现这一点?目前有一个解决方案在Python中使用for循环,它非常慢而且不可伸缩。很遗憾,我无法发布代码


Tags: 数据名称目标dataframepandassqlsection条目
1条回答
网友
1楼 · 发布于 2024-04-20 11:35:30

您是正确的,因为这是为单行sqlite查询设计的问题:

CREATE TABLE IF NOT EXISTS z AS 
SELECT section, x.buyernames AS buyernames_id, y.buyers AS buyers_id
FROM x JOIN y ON x.buyernames = y.buyers;

……但在熊猫身上也有可能。在我看来,最简单的方法是生成两个独立的数据帧,每个数据库一个。然后使用“concat”功能合并两个数据帧The documentation对选项有很好的描述

我可以想象一下你们的桌子,但我对结构不太清楚。如果你仔细阅读这些例子,找出哪一个与你的问题相匹配,那就最好了,我可以进一步帮助你。也许concat不是最好的方法;还有一个join命令

至于最后一步,我不确定您计划为新数据库使用哪个API,因此很难就如何填充新表给出具体的指导。熊猫当然有能力send sql,但我不知道any way to create a new tableWhat would work best is sqlalchemy,但如果你不熟悉ORM或数据库,它有一个学习曲线

编辑:由于您无法提供数据,下面是一个虚构的join命令示例。这应该非常快,没有原始sql那么快,但肯定比for循环快。首先,虚拟数据: 你知道吗

left = pd.DataFrame({'buyernames': ['john', 'frank', 'joe', 'june'],
'section': ['s1', 's2', 's1', 's2'],
'col3': ['C0', 'C1', 'C2', 'C3'],
'col4': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])

right = pd.DataFrame({'buyers': ['june', 'john', 'frank', 'joe'],
'section': ['s1', 's2', 's1', 's2'],
'col3': ['C4', 'C5', 'C6', 'C7'],
'col4': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])

熊猫命令:

result = pd.merge(left, right, on='section')

相关问题 更多 >