Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python生成矩阵(特征矩阵?)_Python_Excel_Pandas_Dataframe_Feature Extraction - Fatal编程技术网

使用Python生成矩阵(特征矩阵?)

使用Python生成矩阵(特征矩阵?),python,excel,pandas,dataframe,feature-extraction,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 J

假设我有一个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)是指当天是否购买了该物品。注意,在我上面描述的矩阵中,只找到了第一个日期的值,即使每个人的初始日期不同。更多的栏目将描述其他日期


请提供帮助。

在读取excel工作表方面,您可以将其导出为CSV文件,并使用Python从工作表中读取值。就个人而言,我会使用
collections
模块中的defaultdict。这允许您为字典键设置默认值。您可以为您拥有的每个唯一名称创建默认值为0的默认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])

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

import pandas as pd
df = pd.concat([df1, df2])
pd.get_dummies(df, columns=['Food bought'], 'Drink bought']).groupby('Name').sum()
说明:首先使用垂直组合两个表。然后,使用to one对“Buyed”列中的值进行热编码——这将为找到的每个独特的食品和饮料添加一列,当该行包含该值时,将添加一个1(因此每行仅添加一个1)。然后将“Name”压缩为名称,最后取每个人的名称,将每个人购买的全部物品汇总到一行中

要将excel文件读入python,请使用您可以使用的。我假设您将数据加载到pandas中,并将数据帧命名为
df1
df2
。首先,将两列
购买的食品
购买的饮料
重命名为类似的名称(我选择了
项目
),以便轻松连接值

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中执行此操作,我们需要将
购物日
转换为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  

“excel文件”是什么意思?比如,一个
.xls
文件,或者只是一个csv?我的意思是它包含在一个.xlsx中,但我可以将它保存为一个.xls或csvIs。如果我个人不知道所有的“名称”,这可能吗?该文件实际上非常大(大约70000个名称,其中一些是重复值),其中每个名称还列出了一天的购物和购买的物品。我想知道Name和Day是否有重复值(比如Bob和mary 14在列表中出现两次)Bob只在新矩阵中出现一次,他当天购买的多个项目将作为1存储在各自的列中。
如果名称不在客户中
检查客户是否已在客户字典中。因此,即使有两个名为“Bob”的条目,他们的购买也将被视为一个条目。这是难以置信的。有几个问题。因为这个列表非常大,我只想看看购物至少4次的人。此外,我想制作一个矩阵,这样你就可以在第1列中列出名字,第2-7列将列出1或0,如果他们买了食物,第8-11列将列出1或0,如果他们买了饮料,第12-17列将与第2-7列相同,但日期#2,18-21与第8-11列相同,但日期#2,22-27与日期#3相同,日期是28-31。关于这一点,我有一些简短的问题。对于两个大型excel文件,我不知道框架的方向是否完全相同,即一个文件中有关Bob的行是否涉及另一个文件中的Bob或Joe。这是否会造成任何并发症?此外,我想列被分组在一起的购物日(因此,如果Bob在三月份去购物,他所有购买的物品都会被标记为1,然后当他在六月份购物时,他所有购买的物品都会在一组新的列中被标记为1。如果这是你要问的,你不必担心行的顺序。太好了。那购物的那天呢。我想更详细地说,我想要为了制作矩阵,使您在第1列中列出姓名,第2-7列将列出他们购买食品时的1或0,第8-11列将列出他们购买饮料时的1或0,然后第12-17列将与第2-7列相同,但日期为#2,第18-21列与第8-11列相同,但日期为#2,第22-27列为日期为#3,第28-31列为日期为#3问题。由于这个列表非常大,我只想看看购物至少4次的人。有没有办法做到这一点,然后只看前三个购物日期?还有没有办法让日期不是单独的一行,而是在新的列中是同一行?我个人很难给你所有的信息这些子问题的答案,尤其是因为您没有提供您在原始问题中试图用来解决问题的代码。一问一答网站也是如此。您所问的问题可以通过浏览本网站找到,这将有助于提高您对熊猫的理解。我认为此答案提供了在直接回答初始问题的同时,为您的附加问题提供一个很好的起点