CSV в JSON, используя выбранные панды столбцы - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь извлечь данные из CSV-файла в файл JSON.CSV имеет несколько столбцов, но мне нужно только col1, col2, col3.Я играл с пандами и пытался заставить его работать, но я не могу понять, как устранить другие столбцы и получить только col1, col2 и col3.Я знаю, что запуск итераторов для панд проходит по всем строкам, что приводит к получению всех столбцов, я попробовал 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", 
            }
        ]

}

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

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

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

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

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

Выполните цикл по этой серии и соберите данные для своего 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 голосов
/ 30 сентября 2018

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

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})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...