Python: анализ CSV путем объединения всех значений ключа в 1 строку и сохранения нового кадра данных - PullRequest
1 голос
/ 15 апреля 2019

У меня есть CSV-файл, который содержит пару ключ-значение, и меня просят объединить все значения, связанные с одним и тем же ключом, в одну строку. Например:

Key,Col1,Col2,Col3
A, 1, A1, C9
A  2, C9, C1
A, 5, C1, C4
B, 7, A8, C5
D, 10 A2, C3

ОБНОВЛЕНОрезультаты, так как в первой строке произошла ошибка \

Это должно привести к следующему: ЗАПИСИ для значения ключа кадра данных

Key,NewCol
A,A1:1:C9:C9:2:C1:C1:5:C4
B,A8:7:C5
D,A2:10:C3

Как видите, они мне нужныв порядке непрерывности по ключу Для записей с ключом = A: ряд должен быть в следующем порядке: значение Col2-Col3 A1 - C9 Тогда следующая запись должна иметь значение Col2-Col3 C9 - XXЗаписи не всегда находятся в правильной последовательности строк, поэтому мне нужно убедиться, что это выполнено, поскольку я сохраняю запись

Я начал делать это и читать CSV и проверять каждое чтение с соответствующимзначение ключа и затем корректировка значения значения, если ключ существует или нет.

import csv
df = []
with open('example.csv') as csvfile:
    readCSV = csv.reader(csvfile, delimiter=',')
    for row in readCSV:
        if df.loc[df.key == row[0]]:
            exist_value  = df[value] 
            df[value]    = exist_value + row[2]+":"+row[1]+":"+row[3]
        else:
            df[key] = row[0]
            df[value] = row[2]+":"+row[1]+":"+row[3]

Вопрос: 1. Есть ли более эффективный способ сделать это?У меня есть большой файл для чтения, и я должен выполнить дополнительную обработку, например:

1 Ответ

0 голосов
/ 17 апреля 2019
import pandas as pd
df = pd.read_csv('waka.csv', header=None)
result = df.groupby(0).agg(lambda x: ':'.join(x.apply(str))).apply(lambda x: ':'.join(x), axis=1)
result

enter image description here

Как это работает:

  • import pandas as pd библиотека импорта панд
  • df = pd.read_csv('waka.csv', header=None) прочитать CSV-файл и записать его в кадр данных
  • df.groupby(0) groupby по столбцу 0 (у вас нет заголовков, поэтому вы должны использовать индексы столбцов
  • agg(lambda x: ':'.join(x.apply(str))) объединить все строки в каждом сгруппированном блоке
  • apply(lambda x: ':'.join(x), axis=1) объединить все столбцы в новой полностью содержащей строке в одну полностью содержащую ячейку

Результат - объект Series с индексами, равными сгруппированным элементам.


Редактировать 1: Обновление спецификации вопроса.

Я не нашел простых решений для объединения сгруппированных строк. Я могу рекомендовать только этот код:

import pandas as pd
df = pd.read_csv('waka.csv', header=None)
grouped = df.groupby(0)
headers = []
bodies = []
for group in grouped.groups:
    headers.append(group)
    bodies.append(grouped.get_group(group).drop(columns=0).apply(lambda x: ':'.join([str(e) if type(e) != str else e for e in x]), axis=1).str.cat(sep=':'))
pd.Series(bodies, index=headers)

В основном это то же самое, но основная строка с генерацией bodies немного отличается:

  • grouped сгруппированный df

  • .get_group(group) особая группа

  • .drop(columns=0) удалить столбец с сгруппированным индексом (A, B или D)

  • .apply(lambda x: ':'.join(WAKA), axis=1) объединить строки в строки

  • WAKA = [str(e) if type(e) != str else e for e in x] обрабатывать нестандартные элементы

  • .str.cat(sep=':') объединить строки в одну строку

Вернется:

B                    7:A8:C5
D                   10:A2:C3
A    1:A1:C9:2:C9:C1:5:C1:C4
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...