【问题标题】:Python group values in 2d list from CSV来自 CSV 的二维列表中的 Python 组值
【发布时间】:2019-03-16 07:49:13
【问题描述】:

我有以下 CSV

BBCP1,Grey,2140,805EC0FFFFE2,0000000066
BBCP1,Test,2150,805EC0FFFFE2,0000000066
BBCP1,Test,2151,805EC0FFFFE1,0000000066
BBCP1,Centre,2141,805EC0FFFFE3,000000077
BBCP1,Yellow,2142,805EC0FFFFE3,000000077
BBCP1,Purple,2143,805EC0FFFFE3,000000077
BBCP1,Green,2144,805EC0FFFFE3,000000077
BBCP1,Pink,2145,805EC0FFFFE3,000000077

我正在使用中读取这些数据

data = list(csv.reader(open(csvFile)))

我想将此数据转换为二维数组或等效数组,并按第 4 列中的值(MAC 地址)进行分组,保留它们所在的顺序在原始列表中。所以它看起来像

[(BBCP1,Grey,2140,805EC0FFFFE2,0000000066),(BBCP1,Test,2150,805EC0FFFFE2,0000000066)],
[(BBCP1,Test,2151,805EC0FFFFE1,0000000066)],
[(BBCP1,Centre,2141,805EC0FFFFE3,000000077),
(BBCP1,Yellow,2142,805EC0FFFFE3,000000077),
(BBCP1,Purple,2143,805EC0FFFFE3,000000077),
(BBCP1,Green,2144,805EC0FFFFE3,000000077),
(BBCP1,Pink,2145,805EC0FFFFE3,000000077)]

希望我正确地显示了数组并且它是有意义的。

然后我需要循环数组以将数据输出到文件。我很确定我可以使用嵌套的 for 循环。

提前感谢您的帮助

【问题讨论】:

    标签: python python-3.x list grouping ordereddict


    【解决方案1】:

    使用defaultdict 对数据进行分组(groupby 需要排序并且效率低/会破坏顺序),然​​后打印排序后的字典值(排序并不是真正需要的,只是为了稳定输出) :

    import csv,collections
    
    d = collections.defaultdict(list)
    
    for row in csv.reader(txt):
        mac_address = row[3]
        d[mac_address].append(row)
    
    print(sorted(d.values()))
    

    导致:

    [[['BBCP1', 'Centre', '2141', '805EC0FFFFE3', '000000077'],
      ['BBCP1', 'Yellow', '2142', '805EC0FFFFE3', '000000077'],
      ['BBCP1', 'Purple', '2143', '805EC0FFFFE3', '000000077'],
      ['BBCP1', 'Green', '2144', '805EC0FFFFE3', '000000077'],
      ['BBCP1', 'Pink', '2145', '805EC0FFFFE3', '000000077']],
     [['BBCP1', 'Grey', '2140', '805EC0FFFFE2', '0000000066'],
      ['BBCP1', 'Test', '2150', '805EC0FFFFE2', '0000000066']],
     [['BBCP1', 'Test', '2151', '805EC0FFFFE1', '0000000066']]]
    

    按key(mac地址)排序:

    values = [v for _,v in sorted(d.items())]
    

    产量:

    [[['BBCP1', 'Test', '2151', '805EC0FFFFE1', '0000000066']],
     [['BBCP1', 'Grey', '2140', '805EC0FFFFE2', '0000000066'],
      ['BBCP1', 'Test', '2150', '805EC0FFFFE2', '0000000066']],
     [['BBCP1', 'Centre', '2141', '805EC0FFFFE3', '000000077'],
      ['BBCP1', 'Yellow', '2142', '805EC0FFFFE3', '000000077'],
      ['BBCP1', 'Purple', '2143', '805EC0FFFFE3', '000000077'],
      ['BBCP1', 'Green', '2144', '805EC0FFFFE3', '000000077'],
      ['BBCP1', 'Pink', '2145', '805EC0FFFFE3', '000000077']]]
    

    【讨论】:

    • 感谢您的快速回复,我已经测试了您的解决方案,它似乎运作良好:)
    【解决方案2】:

    您好,我使用pandasgroupby 来解决问题。希望这会有所帮助!

    data = pd.read_csv('data.txt', header=None)
    data.columns = ['A','B','C','D','E'] # random names to the column
    
    def check(data):
        data_item = []
        for index,item in data.iterrows():
            data_item.append(item.tolist()))
        return data_item   
    
    grouped_data = data.groupby('D',sort=False).apply(check)
    
    for data in grouped_data:
        print(data)
    

    输出#保持顺序

    [['BBCP1', 'Grey', 2140, '805EC0FFFFE2', 66], ['BBCP1', 'Test', 2150, '805EC0FFFFE2', 66]]
    [['BBCP1', 'Test', 2151, '805EC0FFFFE1', 66]]
    [['BBCP1', 'Centre', 2141, '805EC0FFFFE3', 77], ['BBCP1', 'Yellow', 2142, '805EC0FFFFE3', 77], ['BBCP1', 'Purple', 2143, '805EC0FFFFE3', 77], ['BBCP1', 'Green', 2144, '805EC0FFFFE3', 77], ['BBCP1', 'Pink', 2145, '805EC0FFFFE3', 77]]
    

    【讨论】:

      猜你喜欢
      • 2010-10-01
      • 1970-01-01
      • 2015-05-22
      • 2011-05-03
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 2016-05-16
      相关资源
      最近更新 更多