У меня есть 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
Я начал делать это и читать 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. Есть ли более эффективный способ сделать это? У меня есть большой файл для чтения, и я должен сделать больше обработки, например:
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
Как это устроено:
import pandas as pd
импортировать библиотеку пандdf = pd.read_csv('waka.csv', header=None)
читает CSV файл и записывает его в фрейм данныхdf.groupby(0)
сгруппировать по столбцу 0 (у вас нет заголовков, поэтому вы должны использовать индексы столбцовagg(lambda x: ':'.join(x.apply(str)))
объединяет все строки в каждом сгруппированном блокеapply(lambda x: ':'.join(x), axis=1)
объединяет все столбцы в новой полностью содержащей строке в одну полностью содержащую ячейкуРезультатом является объект Series с индексами, равными сгруппированным элементам.
df
это список Python ...