Как записать список dicts в csv и создать фрейм данных pandas из буфера CSV в Python?

#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 — это число с плавающей точкой.