基于pd.date_range生成逐日期行:应当使用Merge、Join还是Concat?
Pandas实现两个DataFrame笛卡尔积的方案选择
你需要实现的是两个无关联字段DataFrame的笛卡尔积(即所有行两两组合),三个方法中**优先使用merge**实现,操作最简便,join和concat都需要额外处理逻辑,不推荐。
你已完成的步骤
1. 生成日期DataFrame
代码如下:
df_dates = pd.DataFrame({'date_prediciton':pd.date_range(start='2021-08-01', end='2021-08-31', freq='W-SUN')}) df_dates.head()
输出样例:
| date_prediciton | |
|---|---|
| 0 | 2021-08-01 |
| 1 | 2021-08-08 |
| 2 | 2021-08-15 |
| 3 | 2021-08-22 |
| 4 | 2021-08-29 |
2. 生成客户信息DataFrame
代码如下:
client = ['101', '102', '103', '104'] df_clients = pd.DataFrame(data=client, columns=['client']) df_clients.head()
输出样例:
| client | |
|---|---|
| 0 | 101 |
| 1 | 102 |
| 2 | 103 |
| 3 | 104 |
具体实现代码
给两个DataFrame添加一个值全部相同的临时连接键,用merge按该键合并后删除临时键即可:
# 添加临时公共键 df_dates['tmp_key'] = 0 df_clients['tmp_key'] = 0 # 合并得到笛卡尔积,删除临时键 df_result = pd.merge(df_clients, df_dates, on='tmp_key').drop('tmp_key', axis=1)
最终结果共20行(4个客户×5个日期),每个客户都会匹配到全部的5个日期,符合需求。
另外两个方法不推荐的原因
concat是沿指定轴做数据拼接,默认不会做行交叉匹配,要实现笛卡尔积需要手动做数据重复、拼接操作,步骤繁琐效率低join是基于索引的合并操作,要实现笛卡尔积需要先将两个DataFrame的索引都设置为相同的常数值,合并后再重置索引,操作步骤比merge多
内容的提问来源于stack exchange,提问作者Kleiton Marques Dos Reis
相关产品推荐
相关产品推荐

