熊猫-从所有可能的列组合中创建一个df

时间:2019-03-22 12:43:20

标签: python pandas

我有这个熊猫数据框:

df = pd.DataFrame([['cat1', 1], ['cat2', 1], ['cat3', 2],
               ['cat1', 3]], columns=['category',
              'number'])

df
Out[32]: 
  category  number
0     cat1       1
1     cat2       1
2     cat3       2
3     cat1       3

第一列代表客户购买的产品类别。第二个代表与购买同一客户相关的编号。因此,该客户进行了3次购买。 我想重塑表格,以使该客户在第一次购买,然后第二次和第三次购买中购买的类别的所有组合以及计算组合数量的新列:

      1     2     3  count
0  cat1  cat3   NaN      1
1  cat2  cat3   NaN      1
2  cat1  cat3  cat1      1
3  cat2  cat3  cat1      1 

我试图像这样旋转它:

df.pivot(columns='nb_achat', values='category')

,但是由于组合原因,它不起作用。你有办法做到吗?

目标是了解第一次购买商品然后第二次购买的顾客,以及有多少顾客在购买1到2中购买了相同类别的商品

编辑: 这是结果的一个例子

result example

1 个答案:

答案 0 :(得分:0)

df = pd.DataFrame([['cat1', 1], ['cat2', 1], ['cat3', 2],
               ['cat1', 3]], columns=['category',
              'number'])

from itertools import product
result_items = []
product_numbers = df.number.sort_values().unique()
product_numbers = product_numbers[product_numbers >= 2]

# get all the combinations of results for all the product numbers
for number in product_numbers:

    purchase_history = []
    for hist in range(1, number+1):
        purchase_history.append(df.category[df.number == hist].tolist())

    for item in product(*purchase_history):

        item_store = {}
        for i in range(1, number+1):
            item_store[i] = item[i-1]

        result_items.append(item_store)

# put them all into a dataframe
results = pd.DataFrame(result_items)
results.fillna(0, inplace=True)
# get the counts of all history
results = results.groupby(results.columns.tolist()).size().reset_index(name='count')
# fix the NaN values
results.where(results!=0, np.nan, inplace=True)
print(results)

结果是:

      1     2     3  count
0  cat1  cat3   NaN      1
1  cat1  cat3  cat1      1
2  cat2  cat3   NaN      1
3  cat2  cat3  cat1      1

itertools解决方案不是特别优雅。我很想看看是否有人可以做到这一点,而不会造成混乱的循环!