从pandas DataFrame问题中删除或提取json字段



我在尝试";"爆炸";或者从包含json列的Pandas DataFrame中提取一些json字段。例如:

import pandas as pd
df = pd.DataFrame({
'id': [101, 102, 103, 104],
'data': [
'{"id": 100, "account_type": aa, "user_name": "Alice"}',
'{"id": 200, "account_type": bb, "user_name": "Alice"}',
'{"id": 300, "account_type": aa, "user_name": "Bob"}',        
'{"id": 400, "account_type": cc, "user_name": "Carol"}'        
]}
)

我想把df转换成这个输出mydf:

mydf = pd.DataFrame({
'id': [101, 102, 103, 104],
'account_type': ['aa','bb','aa','cc'],
"user_name": ['alice','bob','alice','carol']
}
)

正如您所看到的,列data也有一个id列,这与我在Stackoverflow中发现的现有建议相冲突。这个很有前途,但似乎已经过时了,我遇到了一个错误:如何有效地解析JSON内容的panda列?

错误:JSONDecodeError: Expecting value: line 1 column 29 (char 28)

您的示例中缺少引号,这可能是整个问题,无论如何,请参阅下面的完整解决方案,如果您确实有带未引号aa的json字符串,这是另一个问题

import json
import pandas as pd
df = pd.DataFrame({
'id': [101, 102, 103, 104],
'data': [
'{"id": 100, "account_type": "aa", "user_name": "Alice"}',
'{"id": 200, "account_type": "bb", "user_name": "Alice"}',
'{"id": 300, "account_type": "aa", "user_name": "Bob"}',        
'{"id": 400, "account_type": "cc", "user_name": "Carol"}'        
]}
)
df['data'] = [json.loads(x) for x in df['data']]
add_df = pd.json_normalize(df['data'])
add_df = add_df[[c for c in add_df.columns if c not in df.columns]]
pd.concat([df, add_df], axis=1)
tbody>>Alice>Bob
iddata
101{'id':100,'account_type':'aa','user_name':'Alice'}
102{'id':200,'account_type':'bb','user_name':'Alice'}bb
103{'id':300,'account_type':'aa','user_name':'Bob’}aa
104{'id':400,'account_type':'cc','user_name':'Carol'}

最新更新