В этом стиле есть несколько возможных решений, я остановился на одном, который я считаю достойным. Я знаю, что вы сказали, что ввод довольно велик, и вы беспокоились о влиянии явного l oop, поэтому дайте мне знать, если это плохо.
import pandas as pd
raw_data = [['record', ''],
['fname', 'John'],
['lname', 'Smith'],
['bdate', '1985-06-15'],
['record', ''],
['fname', 'Mary'],
['lname', 'Smith'],
['bdate', '1990-03-12']]
# generates dictionaries mapping the column name to the value, for each record
rec_dicts = (dict(raw_data[i + 1:i + 4]) for i in range(0, len(raw_data), 4))
df = pd.DataFrame(rec_dicts)
df['bdate'] = pd.to_datetime(df['bdate'])
print(df)
Вывод:
fname lname bdate
0 John Smith 1985-06-15
1 Mary Smith 1990-03-12
Вот решение, которое учитывает отсутствующие / разные данные в записях.
import pandas as pd
raw_data = [['record', ''],
['fname', 'John'],
['lname', 'Smith'],
['bdate', '1985-06-15'],
['other', 'a value'],
['record', ''],
['fname', 'Mary'],
['lname', 'Smith'],
['bdate', '1990-03-12']]
rec_dicts = []
curr_rec = {}
for curr_key, curr_val in raw_data:
if curr_key == "record":
rec_dicts.append(curr_rec)
curr_rec = {}
else:
curr_rec[curr_key] = curr_val
rec_dicts.append(curr_rec)
if not rec_dicts[0]:
rec_dicts = rec_dicts[1:]
print(rec_dicts, end='\n\n')
df = pd.DataFrame(data=rec_dicts)
df['bdate'] = pd.to_datetime(df['bdate'])
print(df)
Вывод:
[{'fname': 'John', 'lname': 'Smith', 'bdate': '1985-06-15', 'other': 'a value'}, {'fname': 'Mary', 'lname': 'Smith', 'bdate': '1990-03-12'}]
fname lname bdate other
0 John Smith 1985-06-15 a value
1 Mary Smith 1990-03-12 NaN
Как и в предыдущем методе, существует много возможные варианты. Какой из них лучше, будет зависеть от специфики вашей программы.