求Pandas中对应R语言merge(all=TRUE)的等价实现方法
在Pandas中实现DataFrame的笛卡尔积(等价于R的
merge(all=TRUE)) 要实现和你R代码等价的笛卡尔积效果,核心是模拟R中merge(all=TRUE)在无共同列时自动生成笛卡尔积的行为,以下是两种常用方法:
方法1:添加临时连接键(最贴近R的写法)
Pandas的merge需要明确指定连接键,我们可以给两个DataFrame添加一个相同的临时列,再通过这个列做全连接,最后删除临时列:
import pandas as pd # 提取rate_card的目标列 rate_card_subset = rate_card[["service", "duration", "rate"]].copy() # 给两个表添加临时键列 nodes["key"] = 1 rate_card_subset["key"] = 1 # 生成笛卡尔积并移除临时键 prem_subset = pd.merge(nodes, rate_card_subset, on="key").drop("key", axis=1)
方法2:利用MultiIndex构造
通过pd.MultiIndex.from_product生成两个表索引的所有组合,再重新索引拼接:
import pandas as pd rate_card_subset = rate_card[["service", "duration", "rate"]].copy() # 创建两个表索引的笛卡尔积组合 cartesian_idx = pd.MultiIndex.from_product( [nodes.index, rate_card_subset.index], names=["nodes_idx", "rate_card_idx"] ) # 重新索引并拼接两个表 prem_subset = ( nodes.reindex(cartesian_idx.get_level_values(0)).reset_index(drop=True) .join(rate_card_subset.reindex(cartesian_idx.get_level_values(1)).reset_index(drop=True)) )
两种方法都能生成7*10=70行的笛卡尔积结果,其中方法1更贴近你在R中的实现逻辑。
内容的提问来源于stack exchange,提问作者Neeraj Grover
相关产品推荐
相关产品推荐

