Извлечение значения ключа рассчитывается из json данных в столбце в Pandas - PullRequest
1 голос
/ 24 февраля 2020

Я пытался извлечь значения значений ключей из данных json в столбце в Pandas, но безуспешно. Формат данных можно найти во фрейме данных:

    data = [['ID_1', '{\'RestaurantsTakeOut\': \'True\', \'BusinessParking\': "{\'garage\': False, \'street\': False, \'validated\': False, \'lot\': False, \'valet\': False}", \'WiFi\': "u\'no\'", \'RestaurantsDelivery\': \'False\', \'OutdoorSeating\': \'False\', \'RestaurantsAttire\': "u\'casual\'", \'BusinessAcceptsCreditCards\': \'True\', \'RestaurantsGoodForGroups\': \'True\', \'RestaurantsReservations\': \'False\', \'HasTV\': \'False\', \'Ambience\': "{\'romantic\': False, \'intimate\': False, \'touristy\': False, \'hipster\': False, \'divey\': False, \'classy\': False, \'trendy\': False, \'upscale\': False, \'casual\': False}", \'Alcohol\': "u\'none\'", \'RestaurantsPriceRange2\': \'1\', \'GoodForKids\': \'True\'}'], 
        ['ID_2','{\'RestaurantsTakeOut\': \'True\', \'HasTV\': \'True\', \'NoiseLevel\': "u\'average\'", \'Alcohol\': "u\'full_bar\'", \'BusinessAcceptsCreditCards\': \'True\', \'RestaurantsAttire\': "u\'casual\'", \'Caters\': \'False\', \'RestaurantsDelivery\': \'False\', \'RestaurantsTakeOut\': \'True\', \'Ambience\': "{\'romantic\': False, \'intimate\': True, \'classy\': False, \'hipster\': False, \'divey\': False, \'touristy\': False, \'trendy\': False, \'upscale\': False, \'casual\': False}", \'RestaurantsGoodForGroups\': \'True\', \'BusinessParking\': "{\'garage\': False, \'street\': True, \'validated\': False, \'lot\': False, \'valet\': False}", \'GoodForKids\': \'False\', \'RestaurantsPriceRange2\': \'2\', \'WiFi\': "u\'free\'", \'BikeParking\': \'True\', \'RestaurantsReservations\': \'True\'}' ], 
        ['ID_3','{\'RestaurantsTakeOut\': \'False\', \'GoodForKids\': \'True\', \'NoiseLevel\': "u\'average\'", \'RestaurantsPriceRange2\': \'2\', \'BusinessAcceptsCreditCards\': \'True\', \'HasTV\': \'False\', \'OutdoorSeating\': \'False\', \'RestaurantsTakeOut\': \'True\', \'RestaurantsTableService\': \'True\', \'RestaurantsDelivery\': \'False\', \'BusinessParking\': "{\'garage\': False, \'street\': False, \'validated\': False, \'lot\': True, \'valet\': False}", \'RestaurantsReservations\': \'True\', \'BikeParking\': \'True\', \'GoodForMeal\': "{\'dessert\': False, \'latenight\': False, \'lunch\': True, \'dinner\': True, \'brunch\': False, \'breakfast\': False}", \'Ambience\': "{\'romantic\': False, \'intimate\': False, \'touristy\': False, \'hipster\': False, \'divey\': False, \'classy\': False, \'trendy\': False, \'upscale\': False, \'casual\': True}", \'WiFi\': "u\'no\'", \'Alcohol\': "\'beer_and_wine\'", \'RestaurantsGoodForGroups\': \'True\', \'RestaurantsAttire\': "\'casual\'"}']] 

df = pd.DataFrame(data, columns = ['business_id', 'attributes']) 

Я пытался извлечь ключи, значения и числа и поместить результаты в формат, подобный следующему:

Key1 Value1 Count
Key1 Value2 Count
Key2 Value1 Count
Key2 Value2 Count 
Key3 Value1 Count  

После этого я хочу выбрать некоторые ключи и заполнить эти ключи как новые столбцы во фрейме данных, где значения для уникального ключа заполняются в столбце.

    business_id atrributes                     RestaurantsTakeOut
0   ID_1        same as in original dataframe  True 
1   ID_2        same as in original dataframe  True 
2   ID_3        same as in original dataframe  False 

Буду признателен за любые идеи о том, как получить эти результаты.

1 Ответ

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

IIU C,

, вам просто нужно отменить вставку json с помощью модуля ast и pandas json_normalize

from pandas.io.json import json_normalize
from ast import literal_eval

def unnest_json(dataframe, column):
    dataframe_new = json_normalize(dataframe[column].apply(literal_eval))
    return dataframe_new



df1 = unnest_json(df,'attributes')


# going a level further

print(unnest_json(df1,'BusinessParking'))


   garage  street  validated    lot  valet
0   False   False      False  False  False
1   False    True      False  False  False
2   False   False      False   True  False

отметить некоторые из ваших jsons будут иметь поля NaN, вы можете fillna('{}') переназначить их как пустые поля json.

с простым l oop вы можете создать словарь данных на основе ваших ключей

json_fields = ['BusinessParking','Ambience','GoodForMeal']
dfs = {}
for field in json_fields:

    try:
        dataframe = unnest_json(df1,field)
    except ValueError:
        dataframe = unnest_json(df1.fillna('{}'),field)

    dfs[field] = dataframe

print(dfs['Ambience'])

   romantic  intimate  touristy  hipster  divey  classy  trendy  upscale  \
0     False     False     False    False  False   False   False    False   
1     False      True     False    False  False   False   False    False   
2     False     False     False    False  False   False   False    False   

   casual  
0   False  
1   False  
2    True  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...