83036
  
  
ご覧いただきありがとうございます。  
表題の通りですが、例えば「首都圏」というフォルダ内に、  
tokyo.csv  
saitama.csv  
kanagawa.csv  
chiba.csv  
があったときに、ある関数function()を用いると、  
tokyo = pd.read_csv("./首都圏/tokyo.csv")  
が他のcsvファイル(saitama.csv等)にも一括で適用されるようにしたいです。  
※要するにx.csvに対して、x = pd.read_csv(./首都圏/x.csv)を複数回一括で適用したいです

今のところ以下まで実装しており、  
それぞれのcsvをそのfor文のタームにおいて一つ取得できているのは分かっているのですが、  
ここからどうすればそれぞれの変数を作成し格納できるかがわかりません・・・。

[code]

    import pandas as pd
    from pathlib import Path 
    #ディレクトリと拡張子を格納
    p = Path('./首都圏')
    file_name = '*.csv'
    
    #繰り返し用にディレクトリ内のcsvファイル名をリストに格納
    csv_files = p.glob(file_name) 
    
    #フォルダ内のcsvをそれぞれ読み込み、変数に格納する関数を定義
    def function():    
        # 一括でディレクトリ（フォルダ）内のcsvファイルを一括で読込
        for file in csv_files:
    　　　　df1 = pd.read_csv(file)
    　　　　# このタームで正しくfileがdf1に格納されているか確認
    　　　　print(file)
    　　　　print(df1)
    
[/code]

長くなってしまいましたが、お教えいただけますと幸いです。


CC BY-SA 4.0
2021-10-12T06:16:07.857
83034
2021-10-12T07:28:06.047
2021-10-12T07:06:09.147
48610
48610
question
python pandas csv
複数のcsvファイル名の一部を変数化したうえで、それぞれを一括で読み込み格納したい


csvファイル名の一部をキーとした[辞書型](https://docs.python.org/ja/3/tutorial/datastructures.html#dictionaries)を使う方法がシンプルで使いやすいのではないでしょうか。  
※DataFrameにファイル名の列を追加する方法もありますが説明を省きます。

以下のコードは各都市の情報をフォルダから読み取り、それぞれのデータフレームを`dict['tokyo']`、`dict['saitama']`、`dict['kanagawa']`に格納しています。  
(検証のため`首都圏_Mock`フォルダとダミーデータのcsvファイルを作成します)

[code]

    import pandas as pd
    from pathlib import Path 
    
    #ディレクトリと拡張子を格納
    p = Path('./首都圏_Mock')
    
    # ダミーのモック作成
    if not p.is_dir():
        p.mkdir()
    
    df = pd.DataFrame(columns=["都市","人口"], data=[["青梅",132549],["檜原",2194]])
    df.to_csv(p.joinpath('tokyo.csv'))
    df = pd.DataFrame(columns=["都市","人口"], data=[["東秩父",2701],["長瀞",6838]])
    df.to_csv(p.joinpath('saitama.csv'))
    df = pd.DataFrame(columns=["都市","人口"], data=[["愛川",39894],["清川",3038]])
    df.to_csv(p.joinpath('kanagawa.csv'))
    
    file_name = '*.csv'
    
    #繰り返し用にディレクトリ内のcsvファイル名をリストに格納
    csv_files = p.glob(file_name)
    
    def files_to_dic(csv_files):
        dict = {}
        for file in csv_files:
            dict[file.stem] = pd.read_csv(file)  # pathlib.Path.stemで拡張子を除くファイル名を取得
        return dict
    
    # 関数呼び出し
    dict = files_to_dic(csv_files)
    
    print(dict['tokyo'])  # 東京
    
    dict['saitama']['人口'] = dict['saitama']['人口'].apply(lambda x: x*2) # 埼玉の人口を2倍にする
    print(dict['saitama'])
    
[/code]

**実行結果**

[code]

       Unnamed: 0  都市      人口
    0           0  青梅  132549
    1           1  檜原    2194
       Unnamed: 0   都市     人口
    0           0  東秩父   5402
    1           1   長瀞  13676
    
[/code]


CC BY-SA 4.0
2021-10-12T07:18:21.830
83035
2021-10-12T07:18:21.830
9820
83034
answer


`globals()` を利用して global scope に変数を追加します。

#### スクリプト

[code]

    import pandas as pd
    from pathlib import Path
    
    def read_csv_files(dir):
      for i in Path(dir).glob('*.csv'):
        globals()[i.stem] = pd.read_csv(i)
    
    if __name__ == '__main__':
      dir = '首都圏'
      read_csv_files(dir)
    
      print('千葉:\n', chiba)
      print('\n神奈川:\n', kanagawa)
      print('\n埼玉:\n', saitama)
      print('\n東京:\n', tokyo)
    
[/code]

#### ファイル構成

[code]

    $ tree 首都圏
    首都圏
    ├── chiba.csv
    ├── kanagawa.csv
    ├── saitama.csv
    └── tokyo.csv
    
[/code]

#### 出力結果

[code]

    千葉:
        a   b   c
    0  19  20  21
    1  22  23  24
    
    神奈川:
        a   b   c
    0  13  14  15
    1  16  17  18
    
    埼玉:
        a   b   c
    0   7   8   9
    1  10  11  12
    
    東京:
       a  b  c
    0  1  2  3
    1  4  5  6
    
[/code]


CC BY-SA 4.0
2021-10-12T07:20:40.953
83036
2021-10-12T07:28:06.047
2021-10-12T07:28:06.047
47127
47127
83034
answer