Python panda数据帧到JSON对象省略groupby列

时间:2016-02-17 22:35:37

标签: python json csv pandas dataframe

我有一个大型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}]

1 个答案:

答案 0 :(得分:0)

我找到了答案。在groupby参数中设置as_index = False。 JSON对象格式正确,并包含此更改的序列号。

Converting a Pandas GroupBy object to DataFrame

  

聚合函数不会返回您所在的组   聚合如果它们是命名列,当as_index = True时,   默认。分组列将是返回的索引   对象

     

传递as_index = False将返回您正在聚合的组   如果它们被命名为列。