我有一个大型CSV文件,我们将用于将资产导入资产管理数据库。以下是CSV数据的较小示例。
Serial number,Movement type,Posting date
2LMXK1,101,1/5/15 9:00
2LMXK1,102,1/5/15 9:30
2LMXK1,201,1/5/15 10:30
2LMXK1,202,1/5/15 13:00
2LMXK1,301,1/5/15 14:00
JEMLP3,101,1/6/15 9:00
JEMLP3,102,1/7/15 10:00
JEMLP3,201,1/7/15 13:30
JEMLP3,202,1/7/15 15:30
JEMLP3,203,1/7/15 17:30
BR83GP,101,1/5/15 9:00
BR83GP,102,1/5/15 13:00
BR83GP,201,1/6/15 9:00
BR83GP,202,1/7/15 15:30
BR83GP,301,1/5/15 13:00
BR83GP,201,1/6/15 9:00
BR83GP,301,1/9/15 15:30
我需要解析此CSV并返回每个唯一序列号的最新移动类型的JSON对象。
我有一个成功实现的脚本: *解析CSV *按日期和按序列号分组,获取最新日期 *将熊猫数据帧转换为JSON对象(但缺少序列号)
ISSUE: 将数据帧转换为JSON对象时,省略“序列号”列。我认为问题在于“序列号”用作groupby值。我尝试了内置的to_json,但没有以正确的格式返回数据。
数据框包含我需要的正确过滤数据,正如我们在print(last_movement)中看到的那样。
如何创建JSON对象并获取数据框中的所有列?
#Import python modules
import ujson as json
import pandas as pd
import numpy as np
#CSV parse to panda dataframe
pdata = pd.read_csv('import.csv', skipinitialspace=True, parse_dates=[2])
#Sort by posting date to get rows by latest posting date/time only
last_movement = pdata.sort_values('Posting date').groupby('Serial number').last()
print(last_movement)
# RETURNS
# We know the dataframe is correct
#
# Movement type Posting date
#Serial number
#2LMXK1 301 2015-01-05 14:00:00
#BR83GP 301 2015-01-09 15:30:00
#JEMLP3 203 2015-01-07 17:30:00
out = last_movement.to_json()
print(out)
#RETURNS a JSON object that is aggregated by serial number
# {"Movement type":{"2LMXK1":301,"BR83GP":301,"JEMLP3":203},"Posting date":{"2LMXK1":1420466400000,"BR83GP":1420817400000,"JEMLP3":1420651800000}}
当我尝试使用自定义函数迭代值并将数据帧转换为JSON对象时,这是输出。虽然这稍微好一点,但它仍然没有序列号。似乎“groupby”聚合导致序列号列出现一些问题。也许我需要以某种方式“取消组合”结果数据帧,以便我拥有我的过滤数据并将其转换为JSON对象。
#Convert panda dataframe to json object
def tojson(df):
d = [
dict([
(colname, row[i])
for i,colname in enumerate(df.columns)
])
for row in df.values
]
return json.dumps(d)
out = tojson(last_movement)
print(out)
# RETURNS
# MISSING SERIAL NUMBER
# [{"Posting date":1420466400,"Movement type":301},{"Posting date":1420817400,"Movement type":301},{"Posting date":1420651800,"Movement type":203}]
答案 0 :(得分:0)
我找到了答案。在groupby参数中设置as_index = False。 JSON对象格式正确,并包含此更改的序列号。
Converting a Pandas GroupBy object to DataFrame
聚合函数不会返回您所在的组 聚合如果它们是命名列,当as_index = True时, 默认。分组列将是返回的索引 对象
传递as_index = False将返回您正在聚合的组 如果它们被命名为列。