CSV в JSON, используя выбранные панды столбцы

1

Я пытаюсь извлечь данные из csv в файл JSON. У csv есть несколько столбцов, но мне нужно только col1, col2, col3. Я играл с пандами и пытался заставить его работать, но я не могу понять, как устранить другие столбцы и получить только col1, col2 и col3. Я знаю, что запуск iteraterrows для pandas проходит через все строки и который вызывает получение всех столбцов, я пробовал iloc, но не дошел до правильного вывода.

Мой код до сих пор

import pandas as pd
import pdb
from itertools import groupby
from collections import OrderedDict
import json

df = pd.read_csv('test_old.csv', dtype={
            "col1" : str,
            "col2" : str
        })

results = []

for (col1), bag in df.groupby(["col1"]):
    contents_df = bag.drop(["col1"], axis=1)
    labels = [OrderedDict(row) for i,row in contents_df.iterrows()]
    pdb.set_trace()
    results.append(OrderedDict([("col1", col1),
                                ("subset", labels)]))

print json.dumps(results[0], indent=4)
with open('ExpectedJsonFile.json', 'w') as outfile:
    outfile.write(json.dumps(results, indent=4))

CSV

col1,col2,state,col3,val2,val3,val4,val5
95110,2015-05-01,CA,50,30.00,5.00,3.00,3
95110,2015-06-01,CA,67,31.00,5.00,3.00,4
95110,2015-07-01,CA,97,32.00,5.00,3.00,6

Ожидаемый JSON

{
        "col1": "95110", 
        "subset": [
            {
                "col2": "2015-05-01",
                "col3": "50", 
            }, 
            {
                "col2": "2015-06-01", 
                "col3": "67", 
            }, 
            {
                "col2": "2015-07-01", 
                "col3": "97", 
            }
        ]

}
Теги:
pandas
pandas-groupby

2 ответа

1
Лучший ответ

Чтобы сохранить нужные столбцы, попробуйте это

cols_to_keep = ['col1', 'col2', 'col3']
df = df[cols_to_keep]
df

Вы также можете читать только те столбцы, которые вам нужны

df = pd.read_csv('test_old.csv', usecols = ['col1', 'col2', 'col3'],   
                  dtype={"col1" : str, "col2" : str})
  • 0
    Спасибо, я только что попробовал, и ваша реализация довольно проста и меньше изменений в текущем коде. Работает!
  • 1
    Потрясающие. Пожалуйста, примите это как решение.
2

Вы можете делать все группировки в пандах.

Идея этого решения:

Создайте новое подмножество столбцов, в котором вы хотите найти словарь подмножества.

Групповой фрейм данных по col1 в новый фрейм данных. Здесь подмножество связано с каждым элементом из col1. Извлеките подмножество.

Пропустите эту серию и соберите данные для своего json в списке.

Преобразуйте этот список в json с помощью собственных инструментов Python.

import pandas as pd
import json

df = pd.read_csv('test_old.csv', sep=',',
       dtype={
        "col1" : str,
        "col2" : str,
        "col3" : str
    })

# print(df) - compare with example

df['subset'] = df.apply(lambda x: 
                 {'col2': x.col2,
                  'col3': x.col3 }, axis=1)

s = df.groupby('col1').agg(lambda x: list(x))['subset']

results = []

for col1, subset in s.iteritems():
    results.append({'col1': col1, 'subset': subset})

with open('ExpectedJsonFile.json', 'w') as outfile:
    outfile.write(json.dumps(results, indent=4))

ОБНОВЛЕНИЕ: поскольку проблема с примером, вставьте строку print(df) после pd.read_csv и сравните.

Импортируемый фрейм данных должен отображаться как:

    col1        col2 state col3  val2  val3  val4  val5
0  95110  2015-05-01    CA   50  30.0   5.0   3.0     3
1  95110  2015-06-01    CA   67  31.0   5.0   3.0     4
2  95110  2015-07-01    CA   97  32.0   5.0   3.0     6

Конечный результат выглядит так:

[
    {
        "col1": "95110",
        "subset": [
            {
                "col2": "2015-05-01",
                "col3": "50"
            },
            {
                "col2": "2015-06-01",
                "col3": "67"
            },
            {
                "col2": "2015-07-01",
                "col3": "97"
            }
        ]
    }
]

Протестировано с Python 3.5.6 32bit, Pandas 0.23.4, Windows7

  • 0
    Привет, спасибо, я попробовал это, и по некоторым причинам вывод не выходит как ожидалось { "subset": [ { "col2": "5.00", "col3": "3" }, { "col2": "5.00", "col3": "4" }, { "col2": "5.00", "col3": "6" } ], "col1": "95110" }
  • 0
    Мне кажется, что ваш импорт CSV не удается. Я использовал ваш пример из буфера обмена с командой pd.read_clipboard( которая одинакова, кроме имени файла. Поэтому вы должны проверить, действительно ли после чтения df содержит ожидаемые вами столбцы. Или для теста скопируйте ваш пример в буфер обмена и замените команду read_csv .
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню