Я пытаюсь извлечь данные из 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",
}
]
}
Чтобы сохранить нужные столбцы, попробуйте это
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})
Вы можете делать все группировки в пандах.
Идея этого решения:
Создайте новое подмножество столбцов, в котором вы хотите найти словарь подмножества.
Групповой фрейм данных по 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
{ "subset": [ { "col2": "5.00", "col3": "3" }, { "col2": "5.00", "col3": "4" }, { "col2": "5.00", "col3": "6" } ], "col1": "95110" }
pd.read_clipboard(
которая одинакова, кроме имени файла. Поэтому вы должны проверить, действительно ли после чтения df содержит ожидаемые вами столбцы. Или для теста скопируйте ваш пример в буфер обмена и замените команду read_csv
.