csv python разбить данные после запятой и скопировать данные вниз
Есть файл csv
заголовок1; заголовок2; заголовок3; заголовок4;
наименование1; наименование2; 544535425,4324324; 324;
наименование1; наименование2; 432432,4234; 324,4343;
наименование1; наименование2; пустая строка; 3444,444;
как разбить строку 3 и 4 данные после заголовка и перенести данные после запятой вниз? итог:
заголовок1; заголовок2; заголовок3; заголовок4;
наименование1; наименование2; 544535425; 324;
наименование1; наименование2; 4324324; 324;
наименование1; наименование2; 432432; 324;
наименование1; наименование2; 4234; 4343;
наименование1; наименование2; пустая строка; 3444;
наименование1; наименование2; пустая строка; 444;
подскажите пожалуйста как это сделать?
import csv
import os
import pandas as pd
with open('output.csv', 'w') as c:
w = csv.DictWriter(c, ['заголовок1', 'заголовок2', 'заголовок3', 'заголовок4'])
w.writeheader()
with open('example.csv') as a:
for row in csv.DictReader(a):
try:
match = by_name[row['заголовок4']]
except KeyError:
continue
row.update(match)
w.writerow(row)
Ответы (2 шт):
Автор решения: strawdog
→ Ссылка
import pandas as pd
df = pd.read_csv("zagalovak.csv", sep=";").dropna(axis=1)
res = pd.DataFrame()
for col in df.columns:
res =res.join(df[col].str.split(",").explode(), how="outer")
res:
загаловок1 загаловок2 загаловок3 загаловок4
0 наименование1 наименование2 544535425 324
0 наименование1 наименование2 4324324 324
1 наименование1 наименование2 432432 324
1 наименование1 наименование2 432432 4343
1 наименование1 наименование2 4234 324
1 наименование1 наименование2 4234 4343
2 наименование1 наименование2 пустая строка 3444
2 наименование1 наименование2 пустая строка 444
Автор решения: dre-hh
→ Ссылка
Если csv файл отформатирован корректно,
example.csv
заголовок1;заголовок2;заголовок3;заголовок4
наименование1;наименование2;544535425,4324324;324
наименование1;наименование2;432432,4234;324,4343
наименование1;наименование2;пустая строка;3444,444
то будет работать следующий код
import csv
def pad(l, n, element):
"""fills list l with up to n elements"""
return l + [element] * (n - len(l))
def explode_columns(row):
rows = []
column3 = row['заголовок3'].split(',')
column4 = row['заголовок4'].split(',')
column3 = pad(column3, len(column4), column3[-1])
column4 = pad(column4, len(column3), column4[-1])
for values in zip(column3, column4):
row_c = row.copy()
row_c['заголовок3'] = values[0]
row_c['заголовок4'] = values[1]
rows.append(row_c)
return rows
with open('example.csv') as in_f, \
open('output.csv', 'w') as out_f:
w = csv.DictWriter(
out_f, ['заголовок1', 'заголовок2', 'заголовок3', 'заголовок4'],
delimiter=';'
)
w.writeheader()
for row in csv.DictReader(in_f, delimiter=';'):
res_rows = explode_columns(row)
w.writerows(res_rows)
output.csv
заголовок1;заголовок2;заголовок3;заголовок4
наименование1;наименование2;544535425;324
наименование1;наименование2;4324324;324
наименование1;наименование2;432432;324
наименование1;наименование2;4234;4343
наименование1;наименование2;пустая строка;3444
наименование1;наименование2;пустая строка;444