假设我有一个 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 中并将数据框命名为 df1
和 df2
。首先将 Food buy
和 Drink 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/