我在尝试";"爆炸";或者从包含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)
id | data | tbody>|
---|---|---|
101 | {'id':100,'account_type':'aa','user_name':'Alice'} | |
102 | {'id':200,'account_type':'bb','user_name':'Alice'} | bb | >Alice
103 | {'id':300,'account_type':'aa','user_name':'Bob’} | aa | >Bob
104 | {'id':400,'account_type':'cc','user_name':'Carol'} |