Python 使用选定列将CSV转换为JSON

Python 使用选定列将CSV转换为JSON,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我正在尝试将数据从csv提取到JSON文件。csv有几个列,但我只需要col1、col2、col3。我一直在和熊猫玩,试图让它工作,但我不知道如何消除其他列,只得到col1,col2和col3。我知道为pandas运行iteraterrows会遍历所有行,这会导致获取所有列,我尝试了iloc,但没有获得正确的输出 到目前为止我的代码 import pandas as pd import pdb from itertools import groupby from collections impo

我正在尝试将数据从csv提取到JSON文件。csv有几个列,但我只需要col1、col2、col3。我一直在和熊猫玩,试图让它工作,但我不知道如何消除其他列,只得到col1,col2和col3。我知道为pandas运行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", 
            }
        ]

}

要保留所需的列,请尝试以下操作

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": "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": "95110",
        "subset": [
            {
                "col2": "2015-05-01",
                "col3": "50"
            },
            {
                "col2": "2015-06-01",
                "col3": "67"
            },
            {
                "col2": "2015-07-01",
                "col3": "97"
            }
        ]
    }
]

你可以用熊猫做所有的分组

此解决方案背后的理念是:

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

按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))
更新:由于示例存在问题, 在
pd之后插入
print(df)
行。读取\u 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
最后的结果是这样的

df = pd.read_csv('test_old.csv', usecols = ['col1', 'col2', 'col3'],   
                  dtype={"col1" : str, "col2" : str})
[
    {
        "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 32位、Pandas 0.23.4、Windows7进行测试,您可以在Pandas中进行所有分组

此解决方案背后的理念是:

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

按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))
更新:由于示例存在问题, 在
pd之后插入
print(df)
行。读取\u 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
最后的结果是这样的

df = pd.read_csv('test_old.csv', usecols = ['col1', 'col2', 'col3'],   
                  dtype={"col1" : str, "col2" : str})
[
    {
        "col1": "95110",
        "subset": [
            {
                "col2": "2015-05-01",
                "col3": "50"
            },
            {
                "col2": "2015-06-01",
                "col3": "67"
            },
            {
                "col2": "2015-07-01",
                "col3": "97"
            }
        ]
    }
]

使用Python3.5.6 32位、Pandas 0.23.4、Windows7测试,谢谢,我试过了,但由于某种原因,输出结果没有达到预期的效果,{code>{“subset”:[{“col2”:“5.00”,“col3”:“3”},{“col2”:“5.00”,“col3”:“4”},{“col2”:“5.00”、“col3:“6”}]、“col1:“95110”}我认为您的csv导入失败。我使用了剪贴板中的示例,使用了
pd.read\u剪贴板(
command,除了文件名外,它是相同的。因此您应该在阅读后检查df是否真的包含您期望的列。或者,为了进行测试,请将示例复制到剪贴板并替换
read\u csv
命令。是的,我通过保存示例并运行代码验证了这一点。我的json导出看起来很好,请看看你的例子。嗨,我刚刚试过打印和调试。奇怪的是,我输出的唯一问题是“col1”的值在“subset”之后,这不是一个很大的破坏者,因为它的格式是相同的。我使用的是python 2.7和Mac,这可能是它发生变化的原因之一。谢谢:)如果您使用的是旧版Python2.7,请在执行
结果时使用OrderedDict。追加(…
。如果您不知道,Python2.7的寿命将在2020年结束,Pandas将在2019年1月1日放弃对Python2.7的支持,因此如果您可以,现在就转到Python3。您好,谢谢,我尝试了它,出于某种原因,输出结果没有达到预期值
{“子集”:[{“col2”:“5.00”,“col3”:“3”},{“col2”:“5.00”,“col3”:“4”},{“col2”:“5.00”,“col3”:“6”}],“col1”:“95110”}
在我看来,您的csv导入失败。我使用了剪贴板上的示例,使用了
pd.read\u剪贴板(
command,除了文件名外,它是相同的。因此您应该在阅读后检查df是否真的包含您期望的列。或者,为了进行测试,请将示例复制到剪贴板并替换
read\u csv
命令。是的,我通过保存示例并运行代码验证了这一点。我的json导出看起来很好,请看看你的例子。嗨,我刚刚试过打印和调试。奇怪的是,我输出的唯一问题是“col1”的值在“subset”之后,这不是一个很大的破坏者,因为它的格式是相同的。我使用的是python 2.7和Mac,这可能是它发生变化的原因之一。谢谢:)如果您使用的是旧的Python2.7,则在执行
results.append时使用OrderedDict(…
。如果您不知道的话,Python2.7的寿命将在2020年结束,Pandas将在2019年1月1日放弃对Python2.7的支持,因此如果可以的话,现在就转到Python3。谢谢,我刚刚试用过,您的实现非常简单,对当前代码的修改也较少。非常有效!谢谢,我刚刚试用过,您的实现非常成功非常简单,对当前代码的修改也更少。非常有效!