86307


下記のコードを実行することで行いたい処理は次のとおりです。

  1. フォルダ内にあるcsvファイルを全取得する
  2. ファイル構成（カラム名や行数）は同じなので最初に開いたcsvファイル（data_r）の列名から抽出したいカラム番号を選択する
  3. data_rからilocで欲しい列を全行取得（data_c）する（このとき欲しい列は選択したカラム番号になる）
  4. カラム名はどのファイルでも同名のため、カラム名をファイル名にrenameする
  5. 事前に作成しておいたDataFrame（data_p）にdata_cをappendする
  6. 以後、3に戻り選択したカラム番号をilocで抽出し、data_pにappendを繰り返す

私の想定している出力結果は、例えばファイル数が5つあり、1つのファイルに1000行のデータがあるとすればindexが1000行で、columnsがカラム1～カラム5でした。  
しかし実際に得られた出力は、indexが5000行で、columnsがカラム1～カラム5でした。

indexがないことが原因なのかはわかりませんが、すべて別物として扱われているようです。  
そのためどの列も4000行分はNaN値となっていました。  
行数が同じなので、全て1行として横にappendしていってほしいのですがどのように修正すればよろしいでしょうか。

[code]

    files = natsorted(glob.glob('*.csv'))
    
    firstLoop = True
    data_p = pd.DataFrame([])
    for f in files:
        n = os.path.splitext(os.path.basename(f))[0]
        data_r = pd.read_csv(f, encoding='SHIFT_JIS')
        if firstLoop:
            print(f'カラム名は以下となっています \n {data_r.keys()} \n Y軸に使うカラム番号を1つ選択して入力してください')
            yaxis = input('カラム番号（0始まり）:')
            data_c = data_r.iloc[:, [int(yaxis)]].copy()
            data_c.rename(columns={data_c.columns.values[0]:n}, inplace=True)
            firstLoop = False
        else:
            data_c = data_r.iloc[:, [int(yaxis)]].copy()
            data_c.rename(columns={data_c.columns.values[0]:n}, inplace=True)
    
        data_p = data_p.append(data_c)
    data_p
    
[/code]


CC BY-SA 4.0
2022-02-13T05:58:53.950
86306
2022-02-18T15:41:49.010
2022-02-18T15:41:49.010
3060
48769
question
python pandas
最終的に、ilocで取得した列を新しいDataFrameへ横にappendする処理を繰り返したい


そもそもappendは行(縦方向)を追加するものであって、横方向(列)に追加するにはconcat等でaxis=1(あるいはcolumns)を指定するものでしょう。  
それからv1.4.0から非推奨になって、代替手段がconcatになっているので、2重の意味でそちらを使うことになるでしょう。(rowsの太字は引用者)

[pandas.DataFrame.append](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.append.html)

> Append **rows** of _other_ to the end of caller, returning a new object.

> _**Deprecated since version 1.4.0:**_ Use
> [concat()](https://pandas.pydata.org/docs/reference/api/pandas.concat.html#pandas.concat)
> instead. For further details see [Deprecated DataFrame.append and
> Series.append](https://pandas.pydata.org/docs/whatsnew/v1.4.0.html#whatsnew-140-deprecations-
> frame-series-append)

csvを読み取ってDataFrameを作った時にindexが指定されていなくて全て0からの連番になっているのであれば、同じ行番号の位置に追加されるでしょう。

この行を：

[code]

    data_p = data_p.append(data_c)
    
[/code]

このようにしてみれば良いのでは？

[code]

    data_p = pd.concat([data_p, data_c], axis=1)
    
[/code]

試してみてください。

参考記事：  
[結合の方向を指定する -
指定した軸の方向にDataFrameを結合するPandasのconcat関数の使い方](https://deepage.net/features/pandas-
concat.html#%E7%B5%90%E5%90%88%E3%81%AE%E6%96%B9%E5%90%91%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B)  
[pandas.DataFrame, Seriesを連結するconcat](https://note.nkmk.me/python-pandas-
concat/)  
[列名をキーにして横方向に結合(axis=1 or axis='columns') -
【TIPS】Pandasのconcat関数でDataFrameを結合する方法まとめ](https://engineer-lifestyle-
blog.com/code/python/pandas-dataframe-concat-
usage/#axis1_or_axis8217columns8217)

* * *

ちなみに質問最後の方の「行数が同じなので、全て`1行`として」は「行数が同じなので、全て`1列`として」のtypoでしょうね。


CC BY-SA 4.0
2022-02-13T06:53:24.607
86307
2022-02-13T07:07:37.270
2022-02-13T07:07:37.270
26370
26370
86306
answer