Фильтрация pandas данных по значению одного списка элементов в одном столбце - PullRequest
1 голос
/ 04 мая 2020

Я имею дело с API, и когда я преобразовываю ответ в pandas кадр данных, один из столбцов имеет следующую структуру

Ответ API

"USER_ID": 00000,
"USER": "Sales",
"CUSTOMFIELDS": [
            {
                "FIELD_NAME": "CONTACT_FIELD_1",
                "FIELD_VALUE": "EN",
            },
            {
                "FIELD_NAME": "CONTACT_FIELD_10",
                "FIELD_VALUE": true,
            },

Столбец Dataframe (список словарей?)

USER_ID   USER         CUSTOMFIELDS
10        Sales        [{'FIELD_NAME': 'CONTACT_FIELD_1', 'FIELD_VALU...
11        Production   [{'FIELD_NAME': 'CONTACT_FIELD_1', 'FIELD_VALU...
12        Market       [{'FIELD_NAME': 'CONTACT_FIELD_1', 'FIELD_VALU...

1-й ряд столбец CUSTOMFIELDS

CUSTOMFIELDS
[{'FIELD_NAME': 'CONTACT_FIELD_1', 'FIELD_VALUE': 'EN'}, {'FIELD_NAME': 'CONTACT_FIELD_10', 'FIELD_VALUE': 'true'}, {'FIELD_NAME': 'CONTACT_FIELD_2', 'FIELD_VALUE': 'Contact'}]

Цель

Фильтрация строк в базе данных основана на значении одного из элементов в столбце CUSTOMFIELDS. Например, получить все строки данных кадра равными 'FIELD_NAME' = 'CONTACT_FIELD_10' and 'FIELD_VALUE = true'

Я пытаюсь что-то подобное, но не работает

df = df_response[df_response.CUSTOMFIELDS.apply(lambda x: x['FIELD_NAME'] == 'CONTACT_FIELD_1')]

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Вы можете использовать explode в столбце CUSTOMFIELDS, создать из него фрейм данных, query требуемые значения и использовать индекс для выбора в исходном фрейме данных.

# example df
df = pd.DataFrame({'user':[1,2], 
                   'CUSTOMFIELDS':[[{'FIELD_NAME':'CONTACT_FIELD_1', 'FIELD_VALUE':'EN'}, 
                                    {'FIELD_NAME':'CONTACT_FIELD_10', 'FIELD_VALUE':'true'}, 
                                    {'FIELD_NAME':'CONTACT_FIELD_2', 'FIELD_VALUE':'Contact'}], 
                                   [{'FIELD_NAME':'CONTACT_FIELD_1', 'FIELD_VALUE':'EN'}, 
                                    {'FIELD_NAME':'CONTACT_FIELD_10', 'FIELD_VALUE':'false'}, 
                                    {'FIELD_NAME':'CONTACT_FIELD_2', 'FIELD_VALUE':'Contact'}]]})

# define varirables to select
name = 'CONTACT_FIELD_10'
value = 'true'
# explode the column with a list in each cell
s = df['CUSTOMFIELDS'].explode()
# create the list of index to keep when any element of the list match your requirement
idx = pd.DataFrame(s.tolist(), s.index)\
        .query('FIELD_NAME==@name & FIELD_VALUE==@value')\
        .index.unique()

# select the index (could be reassign to df
df_f = df.loc[idx, :]
print (df_f)
   user                                       CUSTOMFIELDS
0     1  [{'FIELD_NAME': 'CONTACT_FIELD_1', 'FIELD_VALU...
0 голосов
/ 04 мая 2020

это может быть альтернативой для проверки на время выполнения:

df_response.loc[[True if val[0]['FIELD_NAME']=='CONTACT_FIELD_1' else False for (i,val) in df_response.CUSTOMFIELDS.iteritems()]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...