使用Python制作矩阵(Feature Matrix?)

2024-10-03 15:30:51 发布

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

假设我有一个excel文件,其中有如下列:

Name      Day of Shopping     Food bought      
 Bob       March 14, 2015           Apple            
 Bob       March 14, 2015            Pear                
 Joe       April 15, 2013           Apple             
 Bob        June 28, 2017     Pomegranite   
Jake      January 4, 2008          Orange   
Jake        April 9, 2010           Peach
 Joe     December 6, 2016          Banana

另一个excel文件显示:

^{pr2}$

我要做的是将其制作成一个新的excel表格,或者只是一个矩阵,其内容如下:

Name   Apple  Pear  Pomegranite Orange Peach Banana Water Juice Soda Tea
Bob     1      1     0           0       0     0     1      0    0    0 
Joe     1      0     0           0       0     0     0      1    0    0 
Jake    0      0     0           1       0     0     1      0    0    0 

最后我得到了一个有名字的矩阵,下面的列列出了食物的选择,名字的赋值(1或0)代表了当天的食物是否被购买。请注意,在我上面描述的矩阵中,尽管每个人的初始日期不同,但只找到第一个日期的值。更多的专栏将描述其他日期。在

请帮忙。在


Tags: 文件nameapple矩阵excelbananabobpear
3条回答

在读取excel表时,可以将它们导出为CSV文件,并使用Python的CSV Parser从工作表中读取值。就个人而言,我会使用collections模块中的defaultdict。这允许您为字典键设置默认值。您可以为您拥有的每个唯一名称创建一个默认dict,并在他们购买新产品时将其值增加1。要创建输出,需要遍历每个客户,然后遍历他们可以购买的产品列表,因为这是一个默认值为0的defaultdict,因此不会出现键不匹配的问题。在

粗略示例代码:

from collections import defaultdict

customers = {}

# Name represents the first column of your CSV entries, and product is the third column
for entry in csvdata:
    name = entry[0]
    if name not in customers:
        customers[name] = defaultdict(int) # Sets the default value to zero
    product = entry[2]
    customers[name][product] += 1

# Now you have a dictionary with customers as sub-dictionaries
# Each sub-dictionary has the count for each product

product_list = ["apples", "oranges", "pears"]

for customer, purchases in customers.items():
    for product in product_list:
        print(purchases[product])

您可以使用^{}来执行此操作。假设您将数据加载到pandas中,并将数据帧命名为df1和{}。首先将两列Food boughtDrink bought重命名为相似的名称(我选择了Item),以方便地连接值

df1.rename(columns={'Food bought':'Item'},inplace=True)
df2.rename(columns={'Drink bought':'Item'},inplace=True)
df = pd.concat([df1,df2])

然后计算交叉表

^{pr2}$

它将输出

Item  Apple  Banana  Juice  Orange  Peach  Pear  Pomegranite  Soda  Tea  Water
Name                                                                          
Bob       1       0      0       0      0     1            1     1    0      1
Jake      0       0      0       1      1     0            0     0    1      1
Joe       1       1      1       0      0     0            0     1    0      0

进一步,您可以计算按日期分组的交叉表。为了在pandas中实现这一点,我们需要将Day of Shopping转换为datetime对象

df['Day of Shopping'] = pd.to_datetime(df['Day of Shopping'])

现在只需将此信息添加到pd.crosstab

pd.crosstab([df['Day of Shopping'],df.Name],df.Item)

Item                  Apple  Banana  Juice  Orange  Peach  Pear  Pomegranite  \
Day of Shopping Name                                                           
2008-01-04      Jake      0       0      0       1      0     0            0   
2010-04-09      Jake      0       0      0       0      1     0            0   
2013-04-15      Joe       1       0      1       0      0     0            0   
2015-03-14      Bob       1       0      0       0      0     1            0   
2016-12-06      Joe       0       1      0       0      0     0            0   
2017-06-28      Bob       0       0      0       0      0     0            1   
Item                  Soda  Tea  Water  
Day of Shopping Name                    
2008-01-04      Jake     0    0      1  
2010-04-09      Jake     0    1      0  
2013-04-15      Joe      0    0      0  
2015-03-14      Bob      0    0      1  
2016-12-06      Joe      1    0      0  
2017-06-28      Bob      1    0      0  

假设第一个电子表格位于名为df1的数据框中,第二个电子表格位于df2中,正确的方法是:

import pandas as pd
df = pd.concat([df1, df2])
pd.get_dummies(df, columns=['Food bought'], 'Drink bought']).groupby('Name').sum()

说明:首先使用^{}垂直组合两个表。然后,使用^{}对“bulled”列中的值进行热编码这将为找到的每个独特的食品和饮料添加一列,当该行包含该值时添加1(因此每行只有一个1)。然后将^{}“Name”压缩成名称,最后取每个人的^{}将购买的商品合计成一行。在

要将excel文件读入python,请使用^{}

相关问题 更多 >