AttrributeError: объект 'Series' не имеет атрибута 'org' при попытке отфильтровать данные - PullRequest
0 голосов
/ 29 ноября 2018

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

import pandas as pd

data = '''{"a": 1, "b": 2, "context": {"org": "company_1", "user": ""}}
{"a": 3, "b": 4, "context": {"org": "", "user": "test"}}
{"a": 5, "b": 6, "context": {"user": "test_2"}}'''

df = pd.load_json(data, lines = True)

filtered_data = df[df.context.org == 'company_1']

К сожалению, этот код вызывает исключение:

AttributeError: у объекта 'Series' нет атрибута 'org'

Я могу понять исключение, поскольку в третьей строке данных не задан context.org.

Однако я не могу «исправить» данные перед попыткой фильтрацииих (здесь мы говорим о паре миллионов строк журнала).

Есть ли способ заставить панд просто игнорировать ошибку?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Использование concat

pd.concat([df[['a','b']],pd.DataFrame(df.context.tolist(),index=df.index)],1)
Out[318]: 
   a  b        org    user
0  1  2  company_1        
1  3  4               test
2  5  6        NaN  test_2
0 голосов
/ 29 ноября 2018

Вы можете фильтровать по словарям, выбирая по get, который также работает, если не существует ключ org:

df1 = df[df['context'].apply(lambda x: x.get('org') == 'company_1')]
#alternative
#df1 = df[[x.get('org') == 'company_1' for x in df['context']]]
print (df1)
   a  b                           context
0  1  2  {'org': 'company_1', 'user': ''}

Но лучше создать столбцы из значений словарей, а затем фильтровать по boolean indexing, потому что многие векторизованные функции панд не работают со словарями в столбце:

df = pd.read_json(data, lines = True)
df = df.join(pd.DataFrame(df.pop('context').values.tolist(), index=df.index))
print (df)

   a  b        org    user
0  1  2  company_1        
1  3  4               test
2  5  6        NaN  test_2

df2 = df2[df2['org'] == 'company_1']
print (df2)
   a  b        org user
0  1  2  company_1   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...