我们说我有一个包含以下列的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)是否为该项目购买天。请注意,在我上面描述的矩阵中,只发现了第一个日期的值,即使每个人的初始日期不同。更多列将描述其他日期。
请帮忙。
答案 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中并将数据框命名为df1
和df2
。首先将列Food bought
和Drink 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