我有一个当前的数据帧,其结构为:
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