使用Pandas选择的列将CSV转换为JSON

时间:2018-09-30 04:48:16

标签: python pandas pandas-groupby

我正在尝试将数据从csv提取到JSON文件。 csv有几列,但我只需要col1,col2,col3。我一直在和熊猫玩耍,并试图使其工作,但我不知道如何消除其他列,而只获得col1,col2和col3。我知道,对熊猫运行iteraterrows会遍历所有行,并且导致获取所有列,所以我尝试了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 :(得分:2)

要保留所需的列,请尝试

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})

答案 1 :(得分:2)

您可以对所有熊猫进行分组。

此解决方案背后的想法:

创建具有所需子集字典的新列 subset

通过col1将数据帧分组为新的数据帧。在这里,子集连接到col1中的每个项目。提取系列子集

浏览本系列文章,并在列表中收集json的数据。

使用Python本机工具将该列表转换为json。

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上进行了测试