77759


画像のように、沢山のデータフレームから任意の列を抜き出して右へと結合していき新たなデータフレームを作りたいと思いgoogle
colaboratoryでコードを書いています。沢山の列を結合させようとfor文を使用してコードを書いているのですが、取り出した列を結合させる段階でエラーが起きたり、最後に取り出した列しか表示されなかったりします。検索しても同じようなエラーが起きるので詰まっております。どのように改善すれば良いのでしょうか。株価のデータで練習していたので、コードもそのまま載せております。

[![やりたいこと](https://i.stack.imgur.com/fIuqn.jpg)](https://i.stack.imgur.com/fIuqn.jpg)

[code]

    %matplotlib inline
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    from pandas_datareader.stooq import StooqDailyReader
    from datetime import datetime
    import numpy as np
    import sys
    import matplotlib.dates as mdate
    
    codes =[1301,1332,1333]
    start = datetime(2021, 6, 1)
    end = datetime(2021, 6, 22)
      
    for n in codes:
        
        brand = str(n) + '.JP'
        stooq = StooqDailyReader(brand, start, end) #stooqから株価情報を取得
        data = stooq.read() 
        df = pd.DataFrame(data) #データフレーム化
        df = df.iloc[::-1]
        df = df["Close"] #終値だけ取り出す
        df = df.drop(columns ='Date') 
        df = df.rename({'Close':'brand'})
        
        print(df,type(df))
        dfc=pd.concat([dfc,df], axis=1)
    
[/code]

以下、エラー内容

[code]

    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-45-49461954e53c> in <module>()
         27 
         28     print(df,type(df))
    ---> 29     dfc=pd.concat([dfc,df], axis=1)
         30 
         31 
    
    1 frames
    /usr/local/lib/python3.7/dist-packages/pandas/core/reshape/concat.py in __init__(self, objs, axis, join, keys, levels, names, ignore_index, verify_integrity, copy, sort)
        357                     "only Series and DataFrame objs are valid"
        358                 )
    --> 359                 raise TypeError(msg)
        360 
        361             # consolidate
    
    TypeError: cannot concatenate object of type '<class 'list'>'; only Series and DataFrame objs are valid
    
[/code]


CC BY-SA 4.0
2021-06-24T08:12:21.413
77757
2021-06-24T11:48:06.930
2021-06-24T11:48:06.930
3060
47011
question
python pandas
pandas.DataFrameの結合を自動化したいです。


以下では list comprehension(リスト内包表記)で `dfc` を作成しています。

※ 元のコードでは日付(index)を削除して銘柄コードを全て `brand` という文字列に置き換えてしまっていますが、少し判りづらい様に見えます。

[code]

    dfc = pd.concat([
              StooqDailyReader(f'{n}.JP', start, end).read()
              .iloc[::-1].reset_index(drop=True).Close
              .rename('brand')
            for n in codes
          ], axis=1)
    
    print(dfc)
    
    # 結果
        brand  brand  brand
    0    2974    514   2435
    1    2918    516   2435
    2    2936    534   2465
    3    2935    540   2455
    4    2942    548   2448
    5    2924    561   2494
    6    2950    560   2513
    7    2947    547   2477
    8    2924    543   2431
    9    2931    542   2425
    10   2949    546   2457
    11   2940    546   2431
    12   2934    543   2419
    13   2915    535   2391
    14   2900    521   2328
    15   2901    539   2427
    
[/code]

#### 追記

[pandas_datareader.stooq.StooqDailyReader](https://pandas-
datareader.readthedocs.io/en/latest/readers/stooq.html#module-
pandas_datareader.stooq) の場合、複数の銘柄をリストにして指定できますので、以下の様に書く事もできます。

[code]

    dfc = (
           StooqDailyReader([f'{n}.JP' for n in codes], start, end).read()
           .Close.iloc[::-1].reset_index(drop=True)
           .set_axis(['brand']*len(codes), axis=1)
         )
    
[/code]


CC BY-SA 4.0
2021-06-24T09:02:38.663
77759
2021-06-24T09:34:50.413
2021-06-24T09:34:50.413
77757
answer