【问题标题】:CSV to JSON using Pandas selected Columns使用 Pandas 选择列的 CSV 到 JSON
【发布时间】:2019-03-05 14:18:41
【问题描述】:

我正在尝试将数据从 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", 
            }
        ]

}

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案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})
    

    【讨论】:

    • 谢谢,我刚刚尝试过,您的实现非常简单,对当前代码的修改也较少。有效!
    【解决方案2】:

    您可以在 pandas 中进行所有分组。

    这个解决方案背后的想法:

    创建一个新列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))
    

    更新:由于示例存在问题, 在pd.read_csv 之后插入print(df) 行并进行比较。

    导入的数据框应显示为:

        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" }
    • 在我看来,您的 csv 导入失败。我使用了剪贴板中的示例,使用了 pd.read_clipboard( 命令,除了文件名之外,它是相同的。因此,您应该在阅读后检查 df 是否确实包含您期望的列。或者为了测试,将您的示例复制到剪贴板并替换 read_csv 命令。
    • 是的,我通过保存您的示例然后运行代码来验证这一点。我的 json 导出看起来不错,所以请检查您的示例。
    • 您好,我刚刚尝试了打印和调试。奇怪的是,我的输出的唯一问题是“col1”的值出现在“子集”之后,这并不是什么大问题,因为它的格式相同。我在 python 2.7 和 Mac 上,这可能是它改变的原因。谢谢:)
    • 如果您使用的是旧版 Python 2.7,请在使用 results.append(... 时使用 OrderedDict stackoverflow.com/questions/10844064/…。如果您不知道,Python2.7 的生命周期是 2020 年,Pandas 将在 2019 年 1 月 1 日停止对 Python 2.7 的支持,所以如果可以的话,现在就迁移到 Python3。
    猜你喜欢
    • 2021-07-26
    • 1970-01-01
    • 2014-04-19
    • 2017-11-20
    • 2021-01-07
    • 1970-01-01
    • 2023-01-10
    • 2021-08-12
    • 2023-04-05
    相关资源
    最近更新 更多