如何将Pandas数据帧中的列分隔为唯一的bin/列



我有一个当前的数据帧,其结构为:

customer    item 1  item 2  item 3
John        Apples  Oranges Bananas
Blake       Bananas
Steph       Oranges Bananas

我感兴趣的是解析每一列,并将它们放入与相同名称相关联的唯一列中;即:

customer    item 1  item 2  item 3
John        Apples  Oranges Bananas
Blake                       Bananas
Steph               Oranges Bananas

在Pandas/Nampy中,做这件事的最佳方式是什么?

这里有一个有效的解决方案,可以为您提供所需的结果。

df=pd.DataFrame({'customer':['John','Blake','Steph'],'item1':['Apples','Bananas','Oranges'],'item2':['Oranges',np.nan,'Bananas'],'item3':['Bananas',np.nan,np.nan]})
#Get unique items
df=pd.melt(df,id_vars=['customer'])
df2=pd.DataFrame(pd.pivot_table(df,columns='value',index='customer',aggfunc='count').to_records())
df2.columns=['customer','item1','item2','item3']
df2['item1'][df2['item1']==1]='Apples'
df2['item2'][df2['item2']==1]='Bananas'
df2['item3'][df2['item3']==1]='Oranges'
df2

与其试图将数据重塑为原始文章中的列,我认为最好将数据重塑成所谓的整洁形式,每行等于一个观察值,然后应用分组。特别是如果最终结果是有问题的项目/客户的计数或总和。

import pandas as pd
import numpy as np
data = pd.DataFrame(np.array([['john', 'apples', 'oranges', 'bananas'], ['blake', 'bananas', '', ''],
['steph', '', 'bananas', 'bananas']]),
columns=['customer', 'item_1', 'item_2', 'item_3'])
# make tidy
tidy_data = pd.melt(data, ['customer'], var_name=['cols'], value_name='item')
tidy_data = tidy_data[['customer', 'item']]
#count each type of item the customer has 
grouped_data = tidy_data.groupby(['customer', 'item'])['item'].count().rename(columns={'item': 'counts'})
grouped_data = grouped_data.reset_index(name='counts')
grouped_data = grouped_data[grouped_data.item != '']
grouped_data

它给出了这个输出:

customer     item  counts
1    blake  bananas       1
2     john   apples       1
3     john  bananas       1
4     john  oranges       1
6    steph  bananas       2

如果你只需要每个项目的计数,而不是客户,那么只需要通过为团队做这件事

grouped_data = tidy_data.groupby(['item'])['item'].count().rename(columns={'item': 'counts'})
grouped_data = grouped_data.reset_index(name='counts')

它给出了这个输出:

item  counts
1   apples       1
2  bananas       4
3  oranges       1