我的数据集结构与下面创建的数据集类似。想象一下,每个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_x
和fruit_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
+ Orange
和Orange
+ Apple
之间没有任何有意义的差异,因此我想删除其中一行。如果有办法获得适当的组合,我对此非常感兴趣,否则,如果有人可以提出建议来消除重复的信息,那也很好。
答案 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
然后,您可以根据程序逻辑计算概率。