我有一个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
和veg
列的多索引进行操作,我将不胜感激,因为我确实对如何在索引中进行操作感到困惑。基于我的SQL经验,我认为这正是索引旨在解决的问题。
reindex
还有一个可选参数fill_value
,可以节省一步操作(例如:df1.reindex(fruit_x_veg, fill_value='UNKNOWN')
)。 - Dan Lenskicartesian_product
位于pandas.core.reshape.util
(而不是pandas.tools.util
)中。 - BeingQuisitive