Python: группировать строку csv по индексу

У меня такой csv:

sku, col1, col2, test, col3, col4, col5, col6
123,456,99,A,,,,
234,786,99,,,,,
345,678,99,A,,,,
123,,,A,18-123,9999,,
234,,,,18-786,9999,,
345,,,A,12-678,9999,,
123,,,,,,18-123,9999
234,,,A,,,18-786,9999
345,,,,,,12-678,9999

Python: группировать строку csv по индексу

это результат объединения 3 CSV (разные заголовки / sku могут быть в 3 файлах с разными заполненными столбцами ..)

Моя цель - сгруппировать столбец по артикулам, чтобы получить что-то вроде taht:

Python: группировать строку csv по индексу

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

И я не знал заранее имени своего столбца, кроме столбца «sku», у которого был «первичный» ключ.

Спасибо

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
732
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Использование pandas.groupby и first:

df.groupby(['sku'],as_index=False).first()
    sku col1    col2    test    col3    col4    col5    col6
0   123 456.0   99.0    A   18-123  9999.0  18-123  9999.0
1   234 786.0   99.0    A   18-786  9999.0  18-786  9999.0
2   345 678.0   99.0    A   12-678  9999.0  12-678  9999.0

Для удаления .0 и преобразования в тип данных int с помощью astype:

df.groupby(['sku'],as_index=False).first().astype(int,errors='ignore')
    sku col1 col2   test    col3    col4    col5    col6
0   123 456    99   A     18-123    9999    18-123  9999
1   234 786    99   A     18-786    9999    18-786  9999
2   345 678    99   A     12-678    9999    12-678  9999

Спасибо, это хорошее (и короткое) решение, но оно добавляет .0 к моему значению. Я пытаюсь заставить его «объектный тип», но все равно есть. Спасибо

Mitchum 30.08.2018 09:16

@Mitchum Проверь обновление и accept the solution если помогло!

Space Impact 30.08.2018 09:35

Спасибо, но я не могу этого сделать, потому что в моих «настоящих» файлах у меня есть текст и другие вещи, если я помещаю все в int, это не работает, как и строка, и объект none. но я оставлю его для другого фильтра, который мне нужно сделать только для int. Благодарность !

Mitchum 30.08.2018 09:41

Если вы можете повлиять на первоначальную обработку файлов csv, я думаю, что вам нужно искать соединение. Просто прочтите все файлы CSV и объедините их в столбце "sku". Однако это зависит от библиотеки или серверной части, которую вы хотите использовать. Если вы используете что-то вроде Spark или Pandas, вы можете напрямую использовать объединения. Если вы используете простой питон, вам понадобится какая-то библиотека или вы сами напишите соединение, как описано здесь: Статья Stackoverflow для присоединения

Спасибо, я поместил все это здесь: gist.github.com/julienanquetil/c0072b47a609e3fd92b8270af8afb‌ a13 В первой части я получаю весь свой заголовок из всех моих CSV, записываю его в CSV и после этого пишу контент. Я безуспешно пытаюсь с пандой сделать это одним выстрелом. Спасибо

Mitchum 30.08.2018 09:19

Использование встроенных csv и collection module

Бывший:

import csv
from collections import defaultdict


d = defaultdict(dict)
with open(filename, "rU") as infile:
    reader = csv.DictReader(infile)
    for line in reader:
        d[line["sku"]].update({k.strip(): v for k,v in line.items() if v})


with open(filename1, "w") as outfile:
    writer = csv.DictWriter(outfile, fieldnames=["sku", "col1", "col2", "test", "col3", "col4", "col5", "col6"])
    writer.writeheader()
    for k, v in d.items():
        writer.writerow(v)
Ответ принят как подходящий

Простое решение, сохраняющее порядок

import csv
from collections import OrderedDict

result = OrderedDict()
with open('data.csv', 'rb') as csvfile, open("out.csv", "w") as outfile:
    csvreader = csv.reader(csvfile, delimiter=',', quotechar='"')
    header = False
    for row in csvreader:
        if not header:
            header = True
            size = len(row)
        sku = row[0]
        existing_val = result.setdefault(sku, [''] * size)
        for idx, each_val in enumerate(row):
            existing_val[idx] = existing_val[idx] or each_val


    csvwriter = csv.writer(outfile, delimiter=',', quotechar='"')
    for each_sku, val_list in result.iteritems():
        csvwriter.writerow(val_list)

Добро пожаловать и благодарим за то, что приняли решение!

Arun Kumar Nagarajan 30.08.2018 09:40

Рабочий способ:

newdf=pd.DataFrame()
newdf['sku']=df['sku'][:3]
for i in df.columns.tolist():
    if i != 'sku':
        newdf[i]=df[i].dropna().tolist()
print(newdf)

Другие вопросы по теме