Решение
Вот еще одно решение:
A. Логика здесь состоит в том, чтобы сначала найти строки, которые начинаются с 4-значных чисел.
B. Как только строки идентифицированы, любая строка (кроме верхней: строка заголовка)
- , которая не имеет четырехзначного номера для начала и
- не имеет трех разделяющих
','
,
будет добавлено к предыдущему ряду.
C. Наконец, все пробелы будут удалены в конце строки, и все строки будут объединены в одну строку, которую пользователь может записать в файл .csv, если он / она пожелает.
D. Мы загружаем в эту строку, используя io.StringIO
в качестве кадра данных.
Example-1
import pandas as pd
from io import StringIO
import re
def get_clean_data(lines):
target_lines = [re.findall('^\d{4}', line) for line in lines]
target_lines_dict = dict((i, val[0]) if (len(val)>0) else (i, None) for i,val in enumerate(target_lines))
correct_lines = list()
line_index = 0
for i,line in enumerate(lines):
if i==0:
correct_lines.append(line.strip())
if i>0:
if target_lines_dict[i] is not None:
correct_lines.append(line.strip())
line_index +=1
else:
correct_lines[line_index] += ' ' + line.strip()
correct_lines = [re.sub(',\s*', ', ', line)+'\n' for line in correct_lines]
ss = ''.join(correct_lines)
return ss
# Dummy Data
s = """
orderid,fruit,count,person
3523,apple,84,peter
2522,green
grape, 99, mary
1299, watermelon, 93, paul
"""
lines = s.strip().split('\n')
# In case of a csv file, use readlines:
# with open('csv_file.csv', 'r') as f:
# lines = f.readlines()
# Get cleaned data
ss = get_clean_data(lines)
# Make Dataframe
df = pd.read_csv(StringIO(ss), sep=',')
print(df)
Выход :
orderid fruit count person
0 3523 apple 84 peter
1 2522 green grape 99 mary
2 1299 watermelon 93 paul
Example-2
Давайте теперь воспользуемся следующими фиктивными данными.
s = """
orderid,fruit,count,person
3523,apple,84,peter
2522,green
grape, 99, mary
1299, watermelon, 93, paul
3523,apple,84,peter
2522,green
banana, 99, mary
1299, watermelon, 93, paul
3523,apple,84,peter
2522,green
apple, 99, mary
1299, watermelon, 93, paul
"""
Выход :
orderid fruit count person
0 3523 apple 84 peter
1 2522 green grape 99 mary
2 1299 watermelon 93 paul
3 3523 apple 84 peter
4 2522 green banana 99 mary
5 1299 watermelon 93 paul
6 3523 apple 84 peter
7 2522 green apple 99 mary
8 1299 watermelon 93 paul