这是在Python 2中完成的,我正在使用Pandas。虽然我希望在SQL中执行此操作,但这可能会使我的生活变得更加轻松,但这不是一种选择。
我有两个数据框,x和y。数据框x有一个列“ BuyerNames”,而y有一个“ Buyers”,并且在其他共享列中都包含一个列“ Section”。 “ x(BuyerNames)”和“ y(Buyers)”中的条目是同一集合,并且共享列中的数据通常是一致的。 我想创建一个数据框,该数据框是y的子集,将其称为y *,以便对于具有相应索引的行,“ BuyerNames”的值等于“ Buyers”的值。此数据帧的长度相同,并且不满足此条件的条目包含一个NaN条目。
我正在创建第三个数据框z,它具有x和y列的并集。我的最后一个目标是用保留在y'中的'Section'条目填充z。
我对数据库非常陌生,因此,关于什么可能非常简单的描述可能令人困惑。如何有效地做到这一点?当前存在一种在Python中使用for循环的解决方案,它非常慢且不可扩展。遗憾的是,我无法发布代码。
答案 0 :(得分:0)
您是正确的,因为这是为单行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;
...但是熊猫当然也有可能。在我看来,最简单的方法是生成两个单独的数据帧,每个数据库一个。然后使用pandas的“ concat”功能合并两个数据框。 The documentation对选项有很好的描述。
我可以为您的表格排序,但是我对结构并不完全清楚。最好查看一下示例,找到哪个与您的问题匹配,我将为您提供进一步的帮助。也许concat不是最好的方法。还有一个加入命令。
对于最后一步,我不确定您打算为新数据库使用哪个API,因此很难为您提供有关如何填充新表的具体指导。熊猫当然有能力send sql,但我不知道any way to create a new table。 What would work best is sqlalchemy,但是如果您不熟悉ORM或数据库,那将是一个学习上的弯路。
编辑:由于您无法提供数据,因此这是联接命令的一个示例。这应该非常快,不如原始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])
和pandas命令:
result = pd.merge(left, right, on='section')