使用Python制作矩阵(特征矩阵?)

时间:2018-03-24 23:18:29

标签: python excel pandas dataframe feature-extraction

我们说我有一个包含以下列的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文件:

Name      Day of Shopping     Drink bought       
 Bob       March 14, 2015            Water    
 Joe       April 15, 2013            Juice    
 Bob        June 28, 2017             Soda
Jake      January 4, 2008            Water
Jake        April 9, 2010              Tea
 Joe     December 6, 2016             Soda

我想要做的是将它变成一个新的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)是否为该项目购买天。请注意,在我上面描述的矩阵中,只发现了第一个日期的值,即使每个人的初始日期不同。更多列将描述其他日期。

请帮忙。

3 个答案:

答案 0 :(得分:0)

在阅读Excel工作表方面,您可以将其导出为CSV文件,并使用Python的CSV Parser从工作表中读取您的值。就个人而言,我会使用collections模块中的defaultdict。这允许您为字典键设置默认值。您可以为每个唯一名称创建一个默认值为0的默认值,并且当他们购买新产品时,将其值增加1.要创建输出,您将遍历每个客户,然后迭代完成他们可以购买的产品列表 - 因为它是一个默认值为0的默认值,您将不会遇到不匹配的密钥问题。

粗略的示例代码:

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])

答案 1 :(得分:0)

假设您在名为df1的数据框中有第一个电子表格,而df2中有第二个电子表格,则执行此操作的正确方法是:

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

说明:首先使用pd.concat垂直组合两个表。然后,使用pd.get_dummies对“已购买”列中的值进行一次热编码 - 这将为找到的每个唯一食物和饮料添加一列,并在该行包含该值时添加1(因此只有一个1每行)。然后将groupby“名称”压缩成名称,最后为每个人提取sum,将每个人购买的总项目合计为一行。

要将excel文件读入python,请使用pd.read_excel

答案 2 :(得分:0)

您可以使用pd.crosstab执行此操作。我假设您已将数据加载到pandas中并将数据框命名为df1df2。首先将列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])

然后计算交叉列表

pd.crosstab(df.Name,df.Item)

将输出

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