我正在尝试将数据从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",
}
]
}
答案 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上进行了测试