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
相关产品推荐
相关产品推荐

