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

标签 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),用于确定该元素是否是为此购买的天。请注意,在我上面描述的矩阵中,即使每个人都有不同的初始日期,也仅找到第一个日期的值。更多列将描述其他日期。

请帮忙。

最佳答案

您可以使用pd.crosstab去做这个。我假设您将数据加载到 pandas 中并将数据框命名为 df1df2。首先将 Food buyDrink buy 两列重命名为相似的名称(我选择 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 转换为日期时间对象

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  

关于python - 使用Python制作矩阵(特征矩阵?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49470965/

相关文章:

python - 来自单个 CSV 文件源的多个列表理解

python - 如何在python中打印百分比值?

vba - 将公式填充到最后使用的列的右侧

python - 为什么在使用 Python 2.7.11 IDLE 时无法保存中文文件?

vba - 在 Vba excel 上突出显示搜索到的单词

c# - OpenXML 与 MS Excel 中的自定义列宽

python - 为什么我在 matplotlib 中得到额外的空图?

python - Mac OS X 10.9 上的带有 Python v2.7.6 RC1 的 pandas 的 Segfault 11

python - 如何在Python中将音频文件输入的语音转换为文本

python - 是否可以使用不带齿轮的 discord.py 进行面向对象编程?