使用Pandas计算JSON文件中的唯一项

时间:2019-07-26 15:38:13

标签: python json pandas

将以下JSON文件提供给Pandas(df = pd.read_json(file)):

[
    {
        "Name": "foo",
        "Details": {
            "Vendor": "Microsoft",
            "Item": "aaa"
        }
    },
    {
        "Name": "bar",
        "Details": {
            "Vendor": "Microsoft",
            "Item": "bbb"
        }
    },
    {
        "Name": "baz",
        "Details": {
            "Vendor": "Microsoft",
            "Item": "ccc"
        }
    },
    {
        "Name": "baz2",
        "Details": {
            "Vendor": "Microsoft",
            "Item": "ccc"
        }
    },
    {
        "Name": "qux",
        "Details": {
            "Vendor": "IBM",
            "Item": "aaa"
        }
    }
]

我想对JSON文件中的项目执行唯一计数。我想知道唯一供应商的数量,以及唯一供应商-项目组合的数量。使用上述JSON,有2个唯一的供应商(Microsoft和IBM),并且有4个唯一的供应商项目组合(baz和baz2是重复的)。

我相信我的当​​前尝试失败了,因为我将JSON存储在DataFrame中。

df = pd.read_json(file)
print(df)

输出:

   Name                                 Details
0   foo  {'Vendor': 'Microsoft', 'Item': 'aaa'}
1   bar  {'Vendor': 'Microsoft', 'Item': 'bbb'}
2   baz  {'Vendor': 'Microsoft', 'Item': 'ccc'}
3  baz2  {'Vendor': 'Microsoft', 'Item': 'ccc'}
4   qux        {'Vendor': 'IBM', 'Item': 'aaa'}

我还尝试了以下操作:print(df.groupby("Details").Vendor.nunique())导致错误:

AttributeError: 'DataFrameGroupBy' object has no attribute 'Vendor'

3 个答案:

答案 0 :(得分:1)

有人问了一个相关问题here。您正在寻找的是json_normalize。下面的代码几乎没有变化。

from pandas.io.json import json_normalize 
a = [
    {
        "Name": "foo",
        "Details": {
            "Vendor": "Microsoft",
            "Item": "aaa"
        }
    },
    {
        "Name": "bar",
        "Details": {
            "Vendor": "Microsoft",
            "Item": "bbb"
        }
    },
    {
        "Name": "baz",
        "Details": {
            "Vendor": "Microsoft",
            "Item": "ccc"
        }
    },
    {
        "Name": "baz2",
        "Details": {
            "Vendor": "Microsoft",
            "Item": "ccc"
        }
    },
    {
        "Name": "qux",
        "Details": {
            "Vendor": "IBM",
            "Item": "aaa"
        }
    }
]
Loaded = json_normalize(a)
print(Loaded)

给我以下输出。现在,您可以对其进行常规聚合查询。 DF ready for aggregation, as seen here

答案 1 :(得分:0)

您可以在输入n之前准备/过滤JSON数据:

pandas

答案 2 :(得分:0)

这是另一种方法。您可以尝试一下。

from pandas.io.json import json_normalize
import pandas as pd
a = pd.read_json("/PathToYourJSON/TempDelete.json")
a['Vendor']=a['Details'].apply(lambda x: x['Vendor'])
a['Item']=a['Details'].apply(lambda x: x['Item'])
a.drop(columns="Details",inplace=True)
print(a)

这给出如下输出。请让我知道这是否是您想要的。

This is the output I see here