【问题标题】:converting json to csv using python pandas使用 python pandas 将 json 转换为 csv
【发布时间】:2017-09-12 05:42:44
【问题描述】:

我已经提到了这个: Nested Json to pandas DataFrame with specific format

还有这个:json_normalize produces confusing KeyError

尝试在 pandas 中使用 json_normalize 规范化我的 json sn-p。 但是,输出并没有完全标准化。这是我的代码的 sn-p

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 列的输出是

values
[{'value': {'share': 2, 'like': 10}}] 

我希望有两列输出,而不是像

value.share   value.like
2                10

我应该如何做到这一点?

【问题讨论】:

    标签: python json csv pandas dataframe


    【解决方案1】:
    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')
    

    【讨论】:

    • 最好能解释一下为什么你的代码可以工作。
    【解决方案2】:

    对于您的数据框,

    您可以使用 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
    

    【讨论】:

      【解决方案3】:

      您可以将json_normalize 再次应用于值列以将其展平:

      pd.concat([
          df.drop('values', 1), 
          df['values'].apply(lambda x: pd.io.json.json_normalize(x).iloc[0])
      ], axis=1)
      

      【讨论】:

        猜你喜欢
        • 2019-03-15
        • 2021-04-26
        • 2017-06-10
        • 2021-12-28
        • 2018-11-06
        • 2022-01-26
        • 1970-01-01
        • 2018-09-16
        • 2017-12-17
        相关资源
        最近更新 更多