#python #pandas #csv
#python #pandas #csv
Вопрос:
Я пытаюсь создать объект csv из списка dicts, а затем создать фрейм данных pandas, прочитав этот объект csv как строковый буфер. Но результирующий фрейм данных pandas мне не подходит. Я не уверен, как правильно его отформатировать. Мне было интересно, может ли кто-нибудь предложить мне правильный подход. Вот код, который я использую:
import pandas as pd
import io
import csv
data = [{"x":123,"y":146},{"x":146,"y":None},
{"x":187,"y":123},{"x":114,"y":184},{"x":1328,"y":977}]
output = io.StringIO()
writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC)
writer.writerow(data)
output.getvalue()
pd.read_csv(io.StringIO(output.getvalue()))
Последняя строка генерирует следующее в одной строке:
{'x': 123, 'y': 146} {'x': 146, 'y': None} {'x': 187, 'y': 123} {'x': 114, 'y': 184} {'x': 1328, 'y': 977}
Я хотел бы отформатировать это как x
и y
как имена столбцов и соответствующие значения в виде строк.
Спасибо
Комментарии:
1. В этом нет ничего плохого. В настоящее время я создаю этот список dicts «на лету», а затем передаю весь список, скажем, более 600 000 записей, в фрейм данных для его создания. Это довольно медленно из-за этого процесса. Итак, мне было интересно, могу ли я использовать поток ввода-вывода буфера вместо списка dicts и передать его прямо для создания фрейма данных.
Ответ №1:
Вы можете использовать следующий код —
import pandas as pd
data = [{"x":123,"y":146},
{"x":146,"y":None},
{"x":187,"y":123},
{"x":114,"y":184},
{"x":1328,"y":977}]
data = pd.DataFrame(data)
data.to_csv("/tmp/test.csv", index=None)
pd.read_csv('/tmp/test.csv', index_col=None)
Ответ №2:
Вот гораздо более простой способ сделать это
import json
import pandas as pd
data = [{"x":123,"y":146},{"x":146,"y":None},
{"x":187,"y":123},{"x":114,"y":184},{"x":1328,"y":977}]
data = json.dumps(data)
df = pd.read_json(data)
print(df)
Вывод:
x y
0 123 146.0
1 146 NaN
2 187 123.0
3 114 184.0
4 1328 977.0
Обратите внимание, что столбец «y» принудительно перемещается с плавающей точкой, потому что NaN — это число с плавающей точкой.