python pandas json_normalize в 1.0.0 с указанным мета-путем - ожидает повторяемость - PullRequest
1 голос
/ 07 февраля 2020

У меня есть данные

[{"state": "Florida",
         "shortname": "FL",
         "info": {"governor": "Rick Scott"},
         "counties": [{"name": "Dade",
                       "population": 12345,
                       "Attributes": [
                         {
                          "capture_date": "2020-01-29",
                          "Spirit_code": "TRLQR",
                          "value": 1
                         },
                         {
                            "capture_date": "2020-01-29",
                            "Spirit_code": "HAVPN",
                            "value": 57000
                        }

                       ]},
                       {"name": "Broward",
                        "population": 40000,
                         "Attributes": [
                         {
                            "capture_date": "2020-01-29",
                            "Spirit_code": "GMSTP",
                            "value": 14
                        },
                        {
                            "capture_date": "2020-01-29",
                            "Spirit_code": "GWTPN",
                            "value": 11212
                        }
                       ]
                       },
                       {"name": "Palm Beach",
                        "population": 60000,
                        "Attributes": [{
                            "capture_date": "2020-01-29",
                            "Spirit_code": "YGHMN",
                            "value": 154.01
                        },
                        {
                            "capture_date": "2020-01-29",
                            "Spirit_code": "CXZASD",
                            "value": 154.01
                        }]
                       }
         ]},
        {"state": "Ohio",
         "shortname": "OH",
         "info": {"governor": "John Kasich"},
         "counties": [{"name": "Summit", "population": 1234,
                      "Attributes": [{
                            "capture_date": "2020-01-29",
                            "Spirit_code": "QWERTY",
                            "value": 154.01
                        },
                        {
                            "capture_date": "2020-01-29",
                            "Spirit_code": "JKLGH",
                            "value": 154.01
                        }]
         },
                      {"name": "Cuyahoga", "population": 1337,
                      "Attributes": [{
                            "capture_date": "2020-01-29",
                            "Spirit_code": "ASDF",
                            "value": 154.01
                        },
                        {
                            "capture_date": "2020-01-29",
                            "Spirit_code": "POIUY",
                            "value": 154.01
                        }]

                      }],
        }
]

И я ищу результат:

state,   shortname, name,       population, attirbute.capture_date, attirbute.spirit_code, attirbute.value
florida, FL        ,Dade,       12345     , 2020-0-29             , TRLQR                , 1
florida, FL        ,Dade,       12345     , 2020-0-29             , HAVPN                , 57000
florida, FL        ,Broward,    40000     , 2020-0-29             , GMSTP                , 14
florida, FL        ,Broward,    40000     , 2020-0-29             , GWTPN                , 11212
florida, FL        ,Palm Beach, 60000     , 2020-0-29             , YGHMN                , 154.01
florida, FL        ,Palm Beach, 60000     , 2020-0-29             , YGHMN                , 154.01
florida, FL        ,Palm Beach, 60000     , 2020-0-29             , CXZASD                , 154.01

В основном нормализация для ключевых атрибутов во вложенных json. Ключ: «Атрибуты».

json_normalize(data["data"], ["counties", "Attributes"], ["state", "shortname", ["counties", "name"], ["counties", "population"]])

Я получаю сообщение об ошибке:

TypeError: {'name': 'Dade', 'population': 12345, 'Attributes': [{'capture_date': '2020-01-29', 'Spirit_code': 'TRLQR', 'value': 1}, {'capture_date': '2020-01-29', 'Spirit_code': 'HAVPN', 'value': 57000}]} has non iterable value 12345 for path ['population']. Must be iterable or null.

, но если я запускаю:

plots_in = json_normalize(data["data"], ["counties", "Attributes"],
                   ["state", "shortname", ["counties", "name"]])

, я получаю результат:

  capture_date Spirit_code     value    state shortname counties.name
0   2020-01-29       TRLQR      1.00  Florida        FL          Dade
1   2020-01-29       HAVPN  57000.00  Florida        FL          Dade
2   2020-01-29       GMSTP     14.00  Florida        FL       Broward
3   2020-01-29       GWTPN  11212.00  Florida        FL       Broward
4   2020-01-29       YGHMN    154.01  Florida        FL    Palm Beach
5   2020-01-29      CXZASD    154.01  Florida        FL    Palm Beach
6   2020-01-29      QWERTY    154.01     Ohio        OH        Summit
7   2020-01-29       JKLGH    154.01     Ohio        OH        Summit
8   2020-01-29        ASDF    154.01     Ohio        OH      Cuyahoga
9   2020-01-29       POIUY    154.01     Ohio        OH      Cuyahoga

есть ли какое-то отношение к целочисленному значению в ключе совокупности? потому что если я запускаю следующее, то все равно получаю ту же ошибку:

plots_in = json_normalize(data["data"], ["counties", "population"])

Пожалуйста, объясните, если кто-то знает, что происходит внизу?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2020

Проверьте вашу версию pandas. Если это pandas 1.0.0, то это, скорее всего, связано с: json_normalize в 1.0.0 с указанным мета-путем - ожидается итерация # 31507

У меня была точно такая же проблема, как и у меня переустанавливал мою среду разработки в linux, включая установку всех последних пакетов с pandas 1.0.0. После некоторого поиска я нашел вышеуказанную ссылку, а затем удалил pandas 1.0.0 и установил pandas 0.25.3, сначала удалив:

pip3 uninstall pandas # or pip uninstall pandas

, а затем:

pip3 install pandas==0.25.3 # or pip install pandas==0.25.3

и после этого все работало нормально, как и до установки последней pandas.

0 голосов
/ 08 февраля 2020

Вот способ сделать:

# s is the given json sample
df = pd.io.json.json_normalize(s)

# unnest the list
df['counties'] = df['counties'].str[0]

# convert counties dict into cols
df = pd.concat([df, df.pop('counties').apply(pd.Series)],  axis=1)

# unnest the list
df['Attributes'] = df['Attributes'].str[0]

# convert Attributes dict into cols
df = pd.concat([df, df.pop('Attributes').apply(pd.Series)],  axis=1)

print(df)

     state shortname info.governor    name  population capture_date  \
0  Florida        FL    Rick Scott    Dade       12345   2020-01-29   
1     Ohio        OH   John Kasich  Summit        1234   2020-01-29   

  Spirit_code   value  
0       TRLQR    1.00  
1      QWERTY  154.01  
...