Python、列表、删除行

2024-06-01 00:24:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有物品清单(每行有以下内容:物品编号、批号、说明、总数量)。如果列表中的某个批号存在两次,则将这两行的数量相加。“数据”是我的原始列表。“max_item”是项目在“数据”中出现的最大次数。我创建了一个新列表(每行一个批次列表),并将更新的行添加到列表中,但我还需要添加“数据”中没有重复批次的行。或者,我需要删除下面代码中未从“data”(data[I+1+j])更新的行。不确定最好的方法是创建新列表还是从原始列表中删除行。希望这是有意义的!非常感谢大家的帮助

下面的示例列表——最后两行具有相同的内部批号。我想将它们的总可用数量相加,然后删除未更新的行

Part Internal Lot Number Description Total available Expiration Date Location

0001    QLN03867    P   2   3/31/2025   FRZ06 Half 1
0002    QLN03923    A   15  4/30/2023   F01-S01-05
0002    QLN03469    A   3   9/30/2022   F01-S03-02
0003    QLN03924    G   15  9/30/2022   F01-S01-05
0003    QLN03470    G   2   9/30/2022   F01-S01-02
0004    QLN03466    U   4   10/31/2022  F01-S03-02
0005    QLN03925    C   10  4/30/2023   F01-S01-02
0005    QLN03471    C   2   9/30/2022   F01-S01-02
0006    QLN03468    R   5   7/31/2021   F01-S03-02
0007    QLN03994    I   2   4/13/2025   F01-S03-03
0007    QLN03994    I   1   4/13/2025   F01-S03-02


data = []
for row in csv_reader:
     azpn = row[0]
     azln = row[1]
     description = row[2]
     location = row[5]
     date = datetime.strptime(row[4], '%m/%d/%Y')
     total_available = int(row[3])

     data.append([azpn, azln, description, total_available, date, location])

one_lot_per_row_list = []
i = 0
j = 1
for i in range(len(data)- max_item):
# if the lot number of row i is equal to the lot number of row i + j

    for j in range(max_item):
        if data[i][1] == data[i+1+j][1]:
             #add total available of data[i] to row data[i+1+j]
            data[i][3] += data[i+1+j][3]
            #append the new row to one_lot_per_row_list
            one_lot_per_row_list.append(data[i])
    j+=1
i+=1

Tags: 数据in列表fordata数量itemmax
2条回答

您可以继续使用您的方法,或选择更优雅的方法,如下所示:

  1. 按批号排序
  2. 按批号分组
  3. 使用reduce函数合并每个组中的项目

IIUC,您可以通过pandas轻松完成这项工作。另一种选择是itertools groupby

这里有一种通过pandas的方法:

  1. groupby批号并转换列{}
  2. 基于subset=['Internal Lot Number', 'Total']删除重复项
  3. 最后,通过to_csv保存CSV文件
import pandas as pd

df = pd.read_csv('your csv file path here')
df.assign(Total=df.groupby('Internal Lot Number')['Total'].transform('sum')).drop_duplicates(
    ['Internal Lot Number', 'Total']).to_csv('output csv file path here')

相关问题 更多 >