使用python和pandas创建组合而不是排列

时间:2015-08-06 20:22:31

标签: python pandas

我的数据集结构与下面创建的数据集类似。想象一下,每个user带来一个带有相应fruit的包。我想计算fruit选项的所有成对组合(不是排列),并使用它们来生成user从中拉出两个fruits后拥有该包的概率。假设没有user带来两个相同的fruit

import pandas as pd
df = pd.DataFrame({'user':['Matt', 'Matt', 'Matt', 'Matt', 'Tom', 'Tom', 'Tom', 'Tom', 'Nick', 'Nick', 'Nick', 'Nick', 'Nick'], 'fruit': ['Plum', 'Apple', 'Orange', 'Pear', 'Grape', 'Apple', 'Orange', 'Banana', 'Orange', 'Grape', 'Apple', 'Banana', 'Tomato']})[['user', 'fruit']]
print df

我的想法是在user上将数据框合并回自身,并根据fruit_xfruit_y的唯一对生成计数。

df_merged = df.merge(df, how='inner', on='user')
print df_merged

不幸的是,合并会产生两种不需要的结果。将fruit合并回自身的实例很容易修复。

df_fix1 = df_merged.query('fruit_x != fruit_y')
gb_pair_user = df_fix1.groupby(['user', 'fruit_x', 'fruit_y'])
df_fix1['pair_user_count'] = gb_pair_user['user'].transform('count')
gb_pair = df_fix1.groupby(['fruit_x', 'fruit_y'])
df_fix1['pair_count'] = gb_pair['user'].transform('count')
df_fix1['probability'] = df_fix1['pair_user_count'] / df_fix1['pair_count'] *1.0
print df_fix1[['fruit_x', 'fruit_y', 'probability', 'user']]

第二种类型是我被困的地方。 Apple + OrangeOrange + Apple之间没有任何有意义的差异,因此我想删除其中一行。如果有办法获得适当的组合,我对此非常感兴趣,否则,如果有人可以提出建议来消除重复的信息,那也很好。

1 个答案:

答案 0 :(得分:0)

您可以利用combinations中的itertools为每位用户创建独特的水果组合。

from itertools import combinations

def func(group): 
    return pd.DataFrame(list(combinations(group.fruit, 2)), columns=['fruit_x', 'fruit_y'])

df.groupby('user').apply(func).reset_index(level=1, drop=True)

     fruit_x fruit_y
user                
Matt    Plum   Apple
Matt    Plum  Orange
Matt    Plum    Pear
Matt   Apple  Orange
Matt   Apple    Pear
Matt  Orange    Pear
Nick  Orange   Grape
Nick  Orange   Apple
Nick  Orange  Banana
Nick  Orange  Tomato
Nick   Grape   Apple
Nick   Grape  Banana
Nick   Grape  Tomato
Nick   Apple  Banana
Nick   Apple  Tomato
Nick  Banana  Tomato
Tom    Grape   Apple
Tom    Grape  Orange
Tom    Grape  Banana
Tom    Apple  Orange
Tom    Apple  Banana
Tom   Orange  Banana

然后,您可以根据程序逻辑计算概率。