Python 使用选定列将CSV转换为JSON
我正在尝试将数据从csv提取到JSON文件。csv有几个列,但我只需要col1、col2、col3。我一直在和熊猫玩,试图让它工作,但我不知道如何消除其他列,只得到col1,col2和col3。我知道为pandas运行iteraterrows会遍历所有行,这会导致获取所有列,我尝试了iloc,但没有获得正确的输出 到目前为止我的代码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
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。谢谢,我刚刚试用过,您的实现非常简单,对当前代码的修改也较少。非常有效!谢谢,我刚刚试用过,您的实现非常成功非常简单,对当前代码的修改也更少。非常有效!