Я пытаюсь сделать систему сортировки.

У меня есть следующие значения в файле .csv

Dan,20,30,15
Dan,15,20,20
Dan,17,11,10
Alex,10,10,10
Alex,11,20,30

Фамилия вместе со значениями должны остаться, а предыдущие должны быть удалены. например, следующие два должны быть переписаны в файл .csv, все остальное удалено:

Dan,17,11,10
Alex,11,20,30

Звучит намного проще, чем есть на самом деле, и мне очень нужна помощь с этим алгоритмом сортировки.

1
niub 1 Окт 2022 в 21:51
Вы можете использовать pandas с groupby.last
 – 
mozway
1 Окт 2022 в 21:56
В этом CSV-файле нет имен столбцов или заголовков?
 – 
khaled koubaa
1 Окт 2022 в 22:04

6 ответов

Я думаю, как предложил @mozway, вы ищете метод groupby.last. Здесь он применяется к вашему примеру:

import pandas as pd

df = pd.DataFrame(
    [
        ['Dan', 20, 30, 15],
        ['Dan', 15, 20, 20],
        ['Dan', 17, 11, 10],
        ['Alex', 10, 10, 10],
        ['Alex', 11, 20, 30],
    ],
    columns=['Name', 'A', 'B', 'C']
)
print(df.groupby('Name').last())
       A   B   C
Name            
Alex  11  20  30
Dan   17  11  10
0
irahorecka 1 Окт 2022 в 22:03

Вам нужно прочитать все данные и сохранить данные в список dict, затем вам нужно восстановить список в dict значения ключа с именем в качестве ключа, поэтому каждый раз, когда вы получаете одно и то же имя, значение будет переназначено

Пример

name,v1,v2,v3,
Dan,20,30,50,
Dan,24,2,75,
Dan,25,78,23,
Alex,12,22,98,
Alex,33,12,32,

Код:

import csv

data = []
with open('csvFile.csv') as csv_file:
    data = [{k: v for k, v in row.items()}
        for row in csv.DictReader(csv_file, skipinitialspace=True)]

new_data = {}
for item in data:
        new_data[item['name']] = [item[value] for value in item]

final_data = [new_data[item] for item in new_data]


print(final_data)
#output
[['Dan', '25', '78', '23', ''], ['Alex', '33', '12', '32', '']]
0
Muhammad Sholeh 1 Окт 2022 в 22:18
Я получаю сообщение об ошибке (KeyError: 'имя')
 – 
niub
1 Окт 2022 в 22:32

Просто скройте его, чтобы диктовать, и колум, который вам нужен, чтобы не дублировать, используйте эту команду

 list(dict.fromkeys(objectid))
-1
mohsen farzadmehr 1 Окт 2022 в 22:02

Я предполагаю, что у вас уже есть содержимое CSV в массиве. Нет необходимости во внешних библиотеках, просто используйте enumerate() для получения индекса. Вы можете прочитать список, используя индекс относительным образом.

Это должно делать то, что вы хотите:

def get_uniques():
    csv_reading = ['Dan,20,30,15', 'Dan,15,20,20', 'Dan,17,11,10', 'Alex,10,10,10', 'Alex,11,20,30']
    final_result = []
    for index, row in enumerate(csv_reading):
        name = row.split(',')[0]  # get the actual name e.g. 'Dan'
        if index < len(csv_reading) - 1:  # needed to avoid index errors 
            next_iteration = csv_reading[index + 1]  # get the next row
            if name not in next_iteration:  # check if the name is in the next row
                final_result.append(row)
        else:
            final_result.append(row)  # always append the last row
    return final_result
0
Christopher Farsbotter 1 Окт 2022 в 22:34
Я извлек данные из файла .csv и вместо этого получил их в следующем формате: ['Dan', '0', '0', '0', 'Dan', '0', '0', ' 0», «Алекс», «0», «0», «0», «Алекс», «0», «0», «0», ]. Есть ли у вас какие-либо советы о том, как я могу использовать эти данные или как получить данные в формате, который вы показали выше?
 – 
niub
1 Окт 2022 в 22:55
Ну да. Используйте функцию join(), чтобы объединить их, вы можете использовать ее так. Понимание списка делает его весьма удобным. reading = [','.join(row) for row in csv.reader(file)]. Вы также можете взглянуть на Dataclasses. На самом деле они вам здесь не нужны, но они сделают вашу жизнь проще.
 – 
Christopher Farsbotter
1 Окт 2022 в 23:10

Вы можете попытаться собрать свои строки в словаре по заданному ключу (например, имя в вашем случае), а затем записать его содержимое обратно в файл.

import csv

unique_rows = {}

with open("data.csv", "r", newline="") as in_file:
    for row in csv.reader(in_file):
        unique_rows[row[0]] = row  # where 0 is the index of your key column

with open("data.csv", "w", newline="") as out_file:
    writer = csv.writer(out_file)
    writer.writerows(unique_rows.values())

В каждом дубликате последняя строка перезапишет предыдущую, хранящуюся в словаре. Или просто сохранить, если в dict нет данного ключа.

1
Savva Surenkov 1 Окт 2022 в 22:18

Приведенный ниже код выводит список списков. Каждый список имеет первый элемент в качестве ключа, а остальные элементы в качестве значений. Он сохраняет последние:

[["Дэн", ["17", "11", "10"]], ["Алекс", ["11", "20", "30"]]]

import json

# Open the file in read mode
file = open("file", "r")
# Convert string into list
lst = file.read().split()

dic = {}

# Populate the first element of each line as the key
# The remaining elements are the values for the key
for line in lst:
  line = line.split(",")
  key, value = line[0], line[1:]
  dic[key] = value

# Convert dict into list
zip = list(zip(dic.keys(), dic.values()))
# Convert dictionary object into nested list
result = json.dumps(zip)

print(result)
0
asultan904 1 Окт 2022 в 23:22