确保密钥的笛卡尔积出现在Pandas选项卡中

2024-07-04 08:13:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Pandas dataframe,它有两个键列,我想确保表中存在这些键的笛卡尔积(因为我必须绘制一个包含所有组合的2D图)。我很难想出一个相当简单和惯用的方法来做这件事。在

例如,我从这张桌子开始,给出了水果和蔬菜的组合,以及它们在一起的味道:

   combo   fruit      veg
0  tasty   apple   carrot
1  yucky  banana   carrot
2  tasty  banana  lettuce
3  yucky   lemon  lettuce

我想以这个表格结束,在这个表格中,所有可能的组合都会出现:

^{pr2}$

我找到了最好的方法:

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'

我想应该有一种更简单、更不容易出错的方法来做到这一点。。。有什么建议吗?在

如果有人能告诉我如何使用和不使用包含fruitveg列的多索引,我将特别感谢,因为我对如何使用索引做这件事感到困惑。根据我的SQL经验,我认为这正是索引的目的。在


Tags: 方法appledfalltastypdbananafruit
1条回答
网友
1楼 · 发布于 2024-07-04 08:13:17

在这个答案之后的某个时候,我将cartesian_product添加到pandas中,并且在添加了{a1}之后不久(按照another question中的建议)。这样可以实现以下更有效的简化:

In [21]: p = pd.MultiIndex.from_product(df1.index.levels, names=df1.index.names)

In [22]: df1.reindex(p, fill_value='UNKNOWN')
Out[22]:
                  combo
fruit  veg
apple  carrot     tasty
       lettuce  UNKNOWN
banana carrot     yucky
       lettuce    tasty
lemon  carrot   UNKNOWN
       lettuce    yucky

旧的答案是:


如果您使用水果和蔬菜作为索引,那么您可以使用^{}*创建MultiIndex到{a4},方法是:

^{pr2}$

最棘手的是抓住所有可能的水果/蔬菜的正确多重指数:

In [12]: fruit_x_veg = list(product(np.unique(df['fruit']), np.unique(df['veg'])))

In [13]: fruit_x_veg = pd.MultiIndex.from_tuples(fruit_x_veg,
                                                 names=['fruit', 'veg'])

然后您可以通过以下方法重新编制索引:

In [14]: df1 = df.set_index(['fruit', 'veg'])

In [15]: df1
Out[15]:
                combo
fruit  veg
apple  carrot   tasty
banana carrot   yucky
       lettuce  tasty
lemon  lettuce  yucky

In [16]: df1.reindex(fruit_x_veg, fill_value='UNKNOWN')
Out[16]:
                  combo
fruit  veg
apple  carrot     tasty
       lettuce  UNKNOWN
banana carrot     yucky
       lettuce    tasty
lemon  carrot   UNKNOWN
       lettuce    yucky

*如果itertools.product不够快,请考虑使用this numpy implemention

注意:这个实现是在pandas.tools.util.cartesian_product中扩展的,它现在支持更多的数据类型(并且在MultiIndex.from_product中暗地使用)。

相关问题 更多 >

    热门问题