71745


python初心者です。  
今、以下のようなデータを

[code]

    [{'target': 0.7784212030131844, 'params': {'max_features': 0.930055846603754, 'min_samples_split': 15.28549923074499, 'n_estimators': 166.1393782636472}}, {'target': 0.7785257751009637, 'params': {'max_features': 0.8211760874650731, 'min_samples_split': 16.400614250497348, 'n_estimators': 111.92312397601592}}, {'target': 0.776748024491158, 'params': {'max_features': 0.8527202619237652, 'min_samples_split': 10.276640212585447, 'n_estimators': 116.17540832901375}}, {'target': 0.7806172465875361, 'params': {'max_features': 0.29610611942435106, 'min_samples_split': 19.14282946636424, 'n_estimators': 67.72864397106717}}, {'target': 0.7804996097807776, 'params': {'max_features': 0.22739455976528197, 'min_samples_split': 15.042813808805764, 'n_estimators': 119.9583310838621}}, {'target': 0.7789571409861411, 'params': {'max_features': 0.9341048879929642, 'min_samples_split': 20.243872075020587, 'n_estimators': 228.1899735138356}}, {'target': 0.7711794688046322, 'params': {'max_features': 0.1937909307963061, 'min_samples_split': 4.557090171066585, 'n_estimators': 78.97987307596247}}, {'target': 0.7802251051028884, 'params': {'max_features': 0.552926909013341, 'min_samples_split': 22.404901421882023, 'n_estimators': 130.17874315815246}}]
    
[/code]

以下のように、pprintしたデータにおいて（長いので省略形にしています）

[code]

    [{'params': {'max_features': 0.930055846603754,
                 'min_samples_split': 15.28549923074499,
                 'n_estimators': 166.1393782636472},
      'target': 0.7784212030131844},
     {'params': {'max_features': 0.8211760874650731,
                 'min_samples_split': 16.400614250497348,
                 'n_estimators': 111.92312397601592},
      'target': 0.7785257751009637},
     {'params': {'max_features': 0.8527202619237652,
                 'min_samples_split': 10.276640212585447,
                 'n_estimators': 116.17540832901375},
      'target': 0.776748024491158}]
    
[/code]

csv出力したいのですが、データ成形の方法がわかりません。

'target', 'max_features', 'min_samples_split',
'n_estimators'の計4つを項目として値を出力したいです。どのようにすればよろしいですか？

※pprint以外の出力方法で可能であればそちらでも構いません。


CC BY-SA 4.0
2020-11-05T05:32:12.180
71743
2020-11-05T08:15:04.253
2020-11-05T08:15:04.253
3060
42526
question
python python3 csv
pprintをcsv出力する方法について


以下は
[csv.DictWriter](https://docs.python.org/3.8/library/csv.html#csv.DictWriter)
を使う方法です。当該のデータは `rev` という変数に格納されているという前提で、ファイル `data.csv`
に出力します。また、`lineterminator='\n'` を指定していますので `data.csv` ファイルの改行コードは
newline(`0x0a`) になります。`lineterminator='\n'` を指定しない場合、改行コードは `\r\n(0x0d0a)`
となりますので Windows OS では必要ないかも知れません。

[code]

    import csv
    
    with open('data.csv', 'w') as csvfile:
      fields = ['target', 'max_features', 'min_samples_split', 'n_estimators']
      writer = csv.DictWriter(csvfile, fieldnames=fields, lineterminator='\n')
      writer.writeheader()
      for row in rev:
        writer.writerow({fields[0]: row[fields[0]], **row['params']})
    
[/code]

[code]

    $ cat data.csv
    target,max_features,min_samples_split,n_estimators
    0.7784212030131844,0.930055846603754,15.28549923074499,166.1393782636472
    0.7785257751009637,0.8211760874650731,16.400614250497348,111.92312397601592
    0.776748024491158,0.8527202619237652,10.276640212585447,116.17540832901375
    0.7806172465875361,0.29610611942435106,19.14282946636424,67.72864397106717
    0.7804996097807776,0.22739455976528197,15.042813808805764,119.9583310838621
    0.7789571409861411,0.9341048879929642,20.243872075020587,228.1899735138356
    0.7711794688046322,0.1937909307963061,4.557090171066585,78.97987307596247
    0.7802251051028884,0.552926909013341,22.404901421882023,130.17874315815246
    
[/code]


CC BY-SA 4.0
2020-11-05T07:10:43.747
71745
2020-11-05T07:10:43.747
71743
answer


その形式だと[pandas.json_normalize](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.json_normalize.html)と[pandas.DataFrame.to_csv](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.DataFrame.to_csv.html)が使えるでしょう。

ただし、`pandas.json_normalize`だけだとネストされたデータの項目名が`params.max_features`とか、`.`で接続された長い名前になるので、それを短縮する処理が必要になります。  
以下のように出来るでしょう。

[code]

    import pandas as pd
    
    data = [{'target': 0.7784212030131844, 'params': {'max_features': 0.930055846603754, 'min_samples_split': 15.28549923074499, 'n_estimators': 166.1393782636472}}, {'target': 0.7785257751009637, 'params': {'max_features': 0.8211760874650731, 'min_samples_split': 16.400614250497348, 'n_estimators': 111.92312397601592}}, {'target': 0.776748024491158, 'params': {'max_features': 0.8527202619237652, 'min_samples_split': 10.276640212585447, 'n_estimators': 116.17540832901375}}, {'target': 0.7806172465875361, 'params': {'max_features': 0.29610611942435106, 'min_samples_split': 19.14282946636424, 'n_estimators': 67.72864397106717}}, {'target': 0.7804996097807776, 'params': {'max_features': 0.22739455976528197, 'min_samples_split': 15.042813808805764, 'n_estimators': 119.9583310838621}}, {'target': 0.7789571409861411, 'params': {'max_features': 0.9341048879929642, 'min_samples_split': 20.243872075020587, 'n_estimators': 228.1899735138356}}, {'target': 0.7711794688046322, 'params': {'max_features': 0.1937909307963061, 'min_samples_split': 4.557090171066585, 'n_estimators': 78.97987307596247}}, {'target': 0.7802251051028884, 'params': {'max_features': 0.552926909013341, 'min_samples_split': 22.404901421882023, 'n_estimators': 130.17874315815246}}]
    
    df = pd.json_normalize(data) #### DataFrame化
    
    #### 項目名の短縮処理
    head = []
    for s in list(df.columns):
      p = s.rfind('.')
      if p < 0:
        head.append(s)
      else:
        p += 1
        head.append(s[p:])
    
    df.columns = head #### 新しい項目名への置き換え
    
    df.to_csv('data.csv', index=False) #### csv化
    
[/code]


CC BY-SA 4.0
2020-11-05T07:21:30.183
71746
2020-11-05T07:21:30.183
26370
71743
answer