You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中SQL UnionAll的等价实现及DataFrame与列表合并方法

在Python中实现SQL的UNION ALL功能,以及DataFrame与列表的笛卡尔积合并

嘿,我来帮你理清楚这两个问题——首先是Pandas里对应SQL UNION ALL的功能,然后是你需要的DataFrame和列表的笛卡尔积合并:

一、Python(Pandas)对应SQL UNION ALL的功能

SQL里的UNION ALL是用来合并结构完全相同的数据集,并且会保留所有行(包括重复行)。在Pandas里,对应的功能是pd.concat()方法,默认参数就完全符合UNION ALL的行为:

  • axis=0:按行方向合并(和UNION ALL的行合并逻辑一致)
  • 不会自动去重:保留所有重复的行

举个简单的例子:

import pandas as pd

# 两个结构相同的DataFrame
df1 = pd.DataFrame([('A',10),('B',20)], columns=['code','value'])
df2 = pd.DataFrame([('C',30),('A',10)], columns=['code','value'])

# 执行类似UNION ALL的合并
union_all_result = pd.concat([df1, df2], ignore_index=True)
print(union_all_result)

输出结果会包含4行,其中A,10的重复行也会被保留:

code  value
0    A     10
1    B     20
2    C     30
3    A     10

如果需要模拟SQL的UNION(去重合并),只需要在concat之后加上drop_duplicates()即可,但这不是你问的UNION ALL,所以重点还是pd.concat的默认用法。

二、合并DataFrame与列表得到笛卡尔积结果

你给出的示例需求其实不是UNION ALL,而是笛卡尔积(让DataFrame的每一行都和列表中的每个元素配对)。这里有两种简单的实现方式:

方法1:用pd.merge的交叉连接(推荐)

Pandas 1.2.0及以上版本支持how='cross'参数,可以直接生成两个数据集的笛卡尔积:

import pandas as pd

# 定义原始DataFrame
df1 = pd.DataFrame([('A',10),('B',20),('C',30)], columns=['code','value'])
# 定义列表
list_A = [100, 200, 300]

# 把列表转为单列DataFrame
list_df = pd.DataFrame(list_A, columns=['list_A'])

# 执行交叉连接得到笛卡尔积
final_result = df1.merge(list_df, how='cross')

print(final_result)

运行后就能得到你想要的结果:

code  value  list_A
0    A     10     100
1    A     10     200
2    A     10     300
3    B     20     100
4    B     20     200
5    B     20     300
6    C     30     100
7    C     30     200
8    C     30     300

方法2:用itertools.product生成组合

如果你用的是旧版本Pandas,或者想手动生成所有组合,可以用itertools.product:

import pandas as pd
from itertools import product

# 定义原始数据
df1 = pd.DataFrame([('A',10),('B',20),('C',30)], columns=['code','value'])
list_A = [100, 200, 300]

# 生成所有行与列表元素的组合
all_combinations = product(df1.itertuples(index=False), list_A)

# 转换为DataFrame
final_result = pd.DataFrame(
    [(row.code, row.value, num) for row, num in all_combinations],
    columns=['code','value','list_A']
)

print(final_result)

这个方法也能得到完全一样的结果,适合处理小规模数据集。

内容的提问来源于stack exchange,提问作者PAstudilloE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:13:34