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

2024-05-16 04:51:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个结构如下的当前数据帧:

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

我感兴趣的是解析每一列并将它们放入与相同名称相关联的唯一列中;i、 电子邮件:

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

在Pandas/Numpy中,什么是实现这一点的最佳方式


Tags: 数据numpy名称pandas电子邮件customeritemjohn
2条回答

我认为最好的方法不是将数据重新格式化为原始文章中的列,而是将数据重新格式化为所谓的tidy form,其中每行等于一个观察值,然后应用group by。特别是如果最终结果是一个计数或总和的项目/客户的问题

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

这里有一个有效的解决方案,可以给你你想要的结果

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

相关问题 更多 >