python - 大熊猫中的笛卡儿产品




4 Answers

这不会赢得代码高尔夫比赛,并借鉴之前的答案 - 但清楚地显示了如何添加密钥,以及联接如何工作。 这将从列表中创建2个新数据框,然后添加密钥以执行笛卡尔积。

我的用例是我需要列表中每周所有商店ID的列表。 所以,我创建了一个我想要的所有周的列表,然后列出了我想要映射它们的所有商店ID。

我选择的合并左边,但在这个设置中在语义上与内部相同。 您可以http://pandas.pydata.org/pandas-docs/stable/merging.html#brief-primer-on-merge-methods-relational-algebra看到这一点,它表明如果组合键在两个表中出现不止一次,它会生成笛卡尔积 - 这就是我们设置的。

days = pd.DataFrame({'date':list_of_days})
stores = pd.DataFrame({'store_id':list_of_stores})
stores['key'] = 0
days['key'] = 0
days_and_stores = days.merge(stores, how='left', on = 'key')
days_and_stores.drop('key',1, inplace=True)
python pandas

我有两个pandas数据帧:

from pandas import DataFrame
df1 = DataFrame({'col1':[1,2],'col2':[3,4]})
df2 = DataFrame({'col3':[5,6]})     

获得笛卡尔积的最佳做法是什么(当然没有像我这样明确地写出来)?

#df1, df2 cartesian product
df_cartesian = DataFrame({'col1':[1,2,1,2],'col2':[3,4,3,4],'col3':[5,5,6,6]})



这个需要最少的代码。 创建一个共同的'密钥'到笛卡尔合并两个:

df1['key'] = 0
df2['key'] = 0

df_cartesian = df1.merge(df2, how='outer')



使用方法链接:

product = (
    df1.assign(key=1)
    .merge(df2.assign(key=1), on="key")
    .drop("key", axis=1)
)



我发现使用pandas MultiIndex是这项工作的最佳工具。 如果列表lists_list列表,请调用pd.MultiIndex.from_product(lists_list)并迭代结果(或在DataFrame索引中使用它)。




Related