我有一个包含两个键列的 Pandas 数据框,我想确保这些键的笛卡尔积存在于表中(因为我必须制作一个包含所有组合的二维图)。我很难想出一个相当简短和惯用的方法来做到这一点。
例如,我从这张表开始,给出了水果和蔬菜的组合,以及它们的味道:
combo fruit veg
0 tasty apple carrot
1 yucky banana carrot
2 tasty banana lettuce
3 yucky lemon lettuce
我想最终得到这张表,其中出现了所有可能的组合:
fruit veg combo
0 apple carrot tasty
1 apple lettuce UNKNOWN
2 banana carrot yucky
3 banana lettuce tasty
4 lemon carrot UNKNOWN
5 lemon lettuce yucky
这是我发现的最好的方法:
import pandas as pd
# Initial data
df=pd.DataFrame(dict(fruit=['apple','banana','banana','lemon'],
veg=['carrot','carrot','lettuce','lettuce'],
combo=['tasty','yucky','tasty','yucky']))
# Solution starts here
veg=df.groupby('veg').size().reset_index()
fruit=df.groupby('fruit').size().reset_index()
fruit[0] = veg[0] = 0 #use this dummy column for the join to work!
cartesian = pd.merge(fruit, veg, how='outer', on=0)
del cartesian[0]
all_combos = pd.merge(cartesian, df, how='left')
all_combos[ pd.isnull(all_combos.combo) ] = 'UNKNOWN'
我想必须有一种更简单且不易出错的方法来做到这一点......有什么建议吗?
如果有人能告诉我如何在有和没有包含fruit
andveg
列的多索引的情况下执行此操作,我将特别感激,因为我真的对如何使用索引执行此操作感到困惑。根据我的 SQL 经验,我认为这些正是索引所针对的情况。