我提到了这个: Nested Json to pandas DataFrame with specific format
并且:json_normalize produces confusing KeyError
尝试使用pandas中的json_normalize来规范化我的json片段。 但是,输出没有完全标准化。这是我的代码片段
var mongoose = require('mongoose');
mongoose.connect('mongodb://<correctuser>:<correctpassword>@ds159670.mlab.com:59670/budget'); // connect to our database
var Budget = require('./models/budget');
值列的输出为
x =[{'fb_metrics': [{'period': 'lifetime', 'values': [{'value': {'share': 2, 'like': 10}}], 'title': 'Lifetime Post Stories by action type', 'name': 'post_stories_by_action_type', '_id': '222530618111374_403476513350116/insights/post_stories_by_action_type/lifetime', 'description': 'Lifetime: The number of stories created about your Page post, by action type. (Total Count)'}]}]
df = pd.io.json.json_normalize(x[0]['fb_metrics'])
我希望有两个列输出,而不是像
values
[{'value': {'share': 2, 'like': 10}}]
我应该如何实现这一目标?
答案 0 :(得分:1)
您可以再次将json_normalize
应用于值列以展平它:
pd.concat([
df.drop('values', 1),
df['values'].apply(lambda x: pd.io.json.json_normalize(x).iloc[0])
], axis=1)
答案 1 :(得分:1)
对于您的数据框,
您可以使用df.from_dcit()
在值中的嵌套字典中创建新的DataFrame:
df2 = pd.DataFrame.from_dict(df['values'].values[0][0], orient = 'index').reset_index().drop(['index'], axis=1)
得到:
df2:
share like
0 2 10
然后将其添加到现有数据框,以使用pd.concat
获取所需格式:
result = pd.concat([df, df2], axis=1, join='inner')
result[['values', 'share', 'like']]
Out[74]:
values share like
0 [{u'value': {u'share': 2, u'like': 10}}] 2 10
如果需要可以重命名:
result.rename(columns={'share': 'values.share', 'like':'values.like'}, inplace=True)
result[['values', 'share', 'like']]
Out[74]:
values values.share values.like
0 [{u'value': {u'share': 2, u'like': 10}}] 2 10
答案 2 :(得分:0)
import pandas as pd
df = pd.read_json('data.json')
df.to_csv('data.csv', index=False, columns=['title', 'subtitle', 'date',
'description'])
import pandas as pd
df = pd.read_csv("data.csv")
df = df[df.columns[:4]]
df.dropna(how='all')
df.to_json('data.json', orient='records')