如何实现numpy数组与pandas Series的笛卡尔积连接?
实现ids与dates的笛卡尔积DataFrame(向量化操作)
以下是几种无需遍历、基于pandas/numpy向量化操作的实现方法,都能高效生成你需要的结果:
方法一:利用MultiIndex.from_product(最简洁)
通过生成笛卡尔积的多级索引,直接转换为DataFrame:
import pandas as pd import numpy as np ids = np.array([1, 2]) dates = pd.Series([10032023, 10042023], name='date') # 生成笛卡尔积多级索引,指定列名 multi_idx = pd.MultiIndex.from_product([ids, dates], names=['id', 'date']) # 转换为DataFrame并重置索引 df = multi_idx.to_frame(index=False) print(df)
输出结果和你预期的完全一致,且天然按date分组排序。
方法二:使用merge的cross连接(直观易懂)
pandas 1.2.0及以上版本支持how='cross'参数,直接实现两个DataFrame的笛卡尔积:
import pandas as pd import numpy as np ids = np.array([1, 2]) dates = pd.Series([10032023, 10042023], name='date') # 将ids和dates分别转为DataFrame df_ids = pd.DataFrame(ids, columns=['id']) df_dates = dates.to_frame() # 交叉合并生成笛卡尔积,再按date排序 df = df_ids.merge(df_dates, how='cross').sort_values('date').reset_index(drop=True) print(df)
方法三:结合itertools.product构造DataFrame
用itertools生成笛卡尔积元组,再转为DataFrame,同样是高效的非遍历方式:
import pandas as pd import numpy as np from itertools import product ids = np.array([1, 2]) dates = pd.Series([10032023, 10042023], name='date') # 生成笛卡尔积元组列表 cartesian_data = list(product(ids, dates)) # 构造DataFrame并按date排序 df = pd.DataFrame(cartesian_data, columns=['id', 'date']).sort_values('date').reset_index(drop=True) print(df)
这三种方法都避免了手动遍历赋值,利用pandas/numpy的内置向量化逻辑,在数据量较大时比循环方式效率高得多。
内容的提问来源于stack exchange,提问作者roulette01
相关产品推荐
相关产品推荐

