我有两个数据集,例如7月和8月数据,每个数字表示下订单的数量。
我想比较两组之间的数据并找出它们之间的任何差异。
主要可以有三个差异
a)=订单已取消(数字存在于左侧数据集中,而不存在于右侧)
b)=新订单(右侧数据集中存在编号,但左侧不存在)
c)=延后的订单(两个数据集中均存在编号(但右侧数据集中的编号在下个月M0处存在)
d)=优先(为简化起见,我们将假定不会发生)
July August
TypeM09 M10 M11 M12 TypeM09 M10 M11 M12
A 0 1 2 0 A 0 1 2 0
B 1 0 0 0 B 0 0 1 0
C 1 2 0 0 C 0 1 0 0
D 1 2 2 0 D 1 0 0 2
注意-在上述类型D中,数字2在M10和M11的左侧数据集中出现两次,在M12的右侧数据集中出现一次。由于程序正在从左到右检查数据,因此一旦程序识别出M12(在左数据集中)存在M10(在左数据集中),因此M11(左数据集中的数字实际上被取消了,因为没有以便在正确的数据集中与之匹配的更多“免费”数字。
程序应读取如下内容
Type M09 M10 M11 M12
A - no change no change - -
B postponement to M11 - - -
C postponement to M10 cancellation - -
D no change postponement to M11 cancellation -
作为输出,我希望实现以下目标:
Type Detail Previous month New month
x Postponement M07 M11
x Postponement M08 M12
y Cancellation M08 -
z New order - M12
答案 0 :(得分:0)
我仍然没有什么疑问,因此只能产生中间输出。 对于上面提到的类型A,B,C,D的示例,请在期望的输出中添加更多的解释
from collections import defaultdict
data_2dlist_1 = [
['Type', 'M09' ,'M10', 'M11', 'M12'],
['A' , 0 , 1 , 2 , 0] ,
['B' , 1 , 0 , 0 , 0] ,
['C' , 1 , 2 , 0 , 0] ,
['D' , 1 , 2 , 2 , 0] ]
data_2dlist_2 =[
['Type', 'M09' ,'M10', 'M11', 'M12'],
['A', 0, 1, 2, 0],
['B', 0, 0, 1, 0],
['C', 0, 1, 0, 0],
['D', 1, 0, 0, 2]]
output_2d = [['Type', 'M09' ,'M10', 'M11', 'M12']]
final_output_2d = [['Type','Detail','Previous month' ,'New month']]
for d1, d2 in zip(data_2dlist_1[1:],data_2dlist_2[1:]):
#print(d1,d2)
output_2d.append([d1[0]]) #new_type row creation
looked = defaultdict()
for i in range(1,len(d1),1):
if d1[i] == 0:
output_2d[-1].append('-')
elif d1[i] == d2[i]:
output_2d[-1].append('no change')
elif d1[i] != 0:
start = i+1
if d1[i] in looked:
start = looked[d1[i]] + 1
try:
found_at = d2.index(d1[i],start)
output_2d[-1].append('postponement to '+ str(data_2dlist_2[0][found_at]))
looked[d1[i]] = found_at
except ValueError: #not found
output_2d[-1].append('cancellation')
elif d2[i] not in looked: #and d1[i] == 0
output_2d[-1].append('new order')
print(output_2d)
'''
[['Type', 'M09', 'M10', 'M11', 'M12'],
['A', '-', 'no change', 'no change', '-'],
['B', 'postponement to M11', '-', '-', '-'],
['C', 'postponement to M10', 'cancellation', '-', '-'],
['D', 'no change', 'postponement to M12', 'cancellation', '-']]
'''