Python 解析此CSV文件并在不使用熊猫的情况下创建?

Python 解析此CSV文件并在不使用熊猫的情况下创建?,python,pandas,dataframe,Python,Pandas,Dataframe,我能够想出如何使用熊猫来实现这一点,但如果没有,我完全不知所措:我得到了两个CSV文件: 订购产品: order_id,product_id,add_to_cart_order,reordered 2,33120,1,1 2,28985,2,1 2,9327,3,0 2,45918,4,1 3,17668,1,1 3,46667,2,1 3,17461,4,1 3,32665,3,1 4,46842,1,0 产品: product_id,product_name,aisle_id,depart

我能够想出如何使用熊猫来实现这一点,但如果没有,我完全不知所措:我得到了两个CSV文件:

订购产品:

order_id,product_id,add_to_cart_order,reordered
2,33120,1,1
2,28985,2,1
2,9327,3,0
2,45918,4,1
3,17668,1,1
3,46667,2,1
3,17461,4,1
3,32665,3,1
4,46842,1,0
产品:

product_id,product_name,aisle_id,department_id
9327,Garlic Powder,104,13
17461,Air Chilled Organic Boneless Skinless Chicken Breasts,35,12
17668,Unsweetened Chocolate Almond Breeze Almond Milk,91,16
28985,Michigan Organic Kale,83,4
32665,Organic Ezekiel 49 Bread Cinnamon Raisin,112,3
33120,Organic Egg Whites,86,16
45918,Coconut Butter,19,13
46667,Organic Ginger Root,83,4
46842,Plain Pre-Sliced Bagels,93,3
然后我将创建一个新表,列出每个部门的订单数量、该部门创建的订单数量、首次订单数量以及该部门的(首次订单数量/订单数量)比率

因此,生成的表如下所示:

department_id,number_of_orders,number_of_first_orders,percentage
3,2,1,0.50
4,2,0,0.00
12,1,0,0.00
13,2,1,0.50
16,2,0,0.00
我的解决方案涉及熊猫:

orders = pd.read_csv("../insight_testsuite/tests/test_1/input/order_products.csv")
products = pd.read_csv("../insight_testsuite/tests/test_1/input/products.csv")

orders.drop(['add_to_cart_order'], axis=1, inplace=True)
products.drop(['aisle_id', 'product_name'], axis=1, inplace=True)

dep = pd.merge(orders, products)

dep = (dep.groupby('department_id')['reordered']
         .agg([('number_of_orders','size'), 
               ('number_of_first_orders', lambda x: x.eq(0).sum())
               ])
         .reset_index())

dep['percentage'] = ("%.2f" % 
   round((dep['number_of_first_orders'] / dep['number_of_orders']), 2))

但是使用常规的Python AFAIK,您只能逐行遍历CSV文件并从中进行评估。所以我不确定你如何在不使用熊猫的情况下进行这种分析

嗯,你可以。这需要做很多工作:

从集合导入defaultdict
作为pd进口熊猫
s1=''订单id,产品id,添加到购物车订单,重新排序
2,33120,1,1
2,28985,2,1
2,9327,3,0
2,45918,4,1
3,17668,1,1
3,46667,2,1
3,17461,4,1
3,32665,3,1
4,46842,1,0'''
s2=''产品标识、产品名称、通道标识、部门标识
9327,大蒜粉,104,13
17461,风冷有机无骨去皮鸡胸,35,12
17668,无糖巧克力杏仁风杏仁牛奶,91,16
28985,密歇根有机甘蓝,83,4
32665,有机以西结49面包肉桂葡萄干,112,3
33120,有机蛋白,86,16
45918,椰子酱,19,13
46667,有机生姜根,83,4
46842,普通预切面包圈,93.3英寸
结果=''部门id、订单数量、首次订单数量、百分比
3,2,1,0.50
4,2,0,0.00
12,1,0,0.00
13,2,1,0.50
16,2,0,0.00'''
行=s1。拆分('\n')
#线条
#[“订单id,产品id,添加到购物车订单,重新排序”,“233120,1,1”,“228985,2,1”,“29327,3,0”,“245918,4,1”,
#  '3,17668,1,1', '3,46667,2,1', '3,17461,4,1', '3,32665,3,1', '4,46842,1,0']
splitlines=[x.split(',')表示x行中的x]
#分裂线
#[['order_id'、'product_id'、'add_to_cart_order'、'reordered']、['2'、'33120'、'1'、['2'、'28985'、'2'、'1'],
#  ['2', '9327', '3', '0'], ['2', '45918', '4', '1'], ['3', '17668', '1', '1'], ['3', '46667', '2', '1'],
#  ['3', '17461', '4', '1'], ['3', '32665', '3', '1'], ['4', '46842', '1', '0']]
订单={}
对于枚举中的j,k(分割线[0]):
阶数[k]=[int(分割线[i][j])范围内的i(1,len(分割线))]
#命令
#{'order_id':[2,2,2,2,3,3,3,4],'product_id':[331202898529327459181766846667174613266546842],
#“向购物车添加订单”:[1,2,3,4,1,2,4,3,1],“重新排序”:[1,1,0,1,1,1,1,0]}
lines=s2.split('\n')
#线条
#[“产品标识,产品名称,通道标识,部门标识”,“9327,大蒜粉,104,13”,
#‘17461,风冷有机无骨去皮鸡胸,35,12’,
#17668年,不含糖巧克力杏仁风杏仁牛奶,91,16年,28985年,密歇根有机甘蓝,83,4年,
#32665,有机以西结49面包肉桂葡萄干,112,3',33120,有机蛋白,86,16',45918,椰子酱,19,13',
#'46667,有机姜根,83,4','46842,普通预切片百吉饼,93,3']
splitlines=[x.split(',')表示x行中的x]
#分裂线
#[[product_id]、[product_name]、[Roads_id]、[department_id]、[9327]、[大蒜粉]、[104]、[13],
#['17461','风冷有机无骨去皮鸡胸','35','12'],
#['17668','不含糖巧克力杏仁风杏仁牛奶','91','16'],
#['28985','Michigan Organic Kale','83','4'],['32665','Organic Ezekiel 49面包肉桂葡萄干','112','3'],
#[33120]、“有机蛋白”、“86”、“16”]、[45918”、“椰子酱”、“19”、“13”],
#['46667','有机生姜根','83','4'],['46842','普通预切面包圈','93','3']]
产品={}
对于枚举中的j,k(分割线[0]):
产品[k]=[范围内i的分割线[i][j](1,len(分割线))]
#产品
#{'product_id':['9327','17461','17668','28985','32665','33120','45918','46667','46842'],
#“产品名称”:[“大蒜粉”,“风冷有机无骨去皮鸡胸”,
#“无糖巧克力杏仁风杏仁牛奶”、“密歇根有机甘蓝”,
#“有机以西结49面包肉桂葡萄干”、“有机蛋白”、“椰子酱”,
#‘有机姜根’、‘纯切百吉饼’],
#“过道标识”:[104”、“35”、“91”、“83”、“112”、“86”、“19”、“83”、“93]”,
#"部门编号:[13,12,16,4,3,16,13,4,3']
部门=列表(集合(产品['department\u id']))
#部门
# ['13', '16', '12', '3', '4']
订单计数=defaultdict(int)
对于产品中的东西[“部门id”]:
订单计数[事物]+=1
#订单数量
#defaultdict(,{'13':2,'12':1,'16':2,'4':2,'3':2})
报告={}
departments.sort(key=lambda x:int(x))
#部门
# ['3', '4', '12', '13', '16']
报告['department_id']=部门
报告['number\u of_orders']=[报告['department\u id']中dep的订单计数[dep]
#报告
#{'department_id':['3','4','12','13','16'],'number_of_orders':[2,2,1,2,2]}
第一顺序计数=defaultdict(int)
部门产品=默认目录(列表)
对于范围内的i(len(产品['product_id']):
如果部门中的产品['department_id'][i]:
部门产品[products['department\u id'][i]]。追加(products['product\u id'][i])
#部门产品
#defaultdict(,{'13':['9327','45918'],'12':['17461'],'16':['17668','33120'],'4':['28985','46667'],'3':['32665','46842'])
订单数量=默认数字(整数)
产品部门={}
对于dep,部门\产品项()中的产品列表:
对于产品列表中的产品:
产品部门[产品]=部门
#产品部
# {'9327': '13', '45918': '13', '17461': '12', '17668': '16', '33120': '16', '28985': '4', '46667': '4', '32665': '3',
#  '46842': '3'}
第一顺序计数=defaultdict(int)
对于产品,在zip中重新排序(订单['product_id'],订单['reordered']):
如果部门中的产品部门[str(prod)]和int(重新排序)=0:
第一批订单数量[产品部门[订单(生产)]]+=1
#一阶计数
#defaultdict(,{'13':1,'3':1})
代表