

各社のCSVデータをfor文で読み込み、必要なカラムだけ抽出して新たなデータフレームを作成したいと考えております。  
ファイル読込み後、添付画像のようにA，Bの売上を抽出して、新たなデータフレームを作成するにはどのようにすればよろしいでしょうか。（稀に売上データに欠損値がある場合もございます。）

ご教示のほどよろしくお願い申し上げます。

[code]

    # ファイル指定
    outfolder = '...r/'
    #loopでデータ読込したい（ID(10と20)はdataというデータフレームで保持している）
    for index, id in enumerate(data['ID'].unique()):
        #フォルダ＋ファイル名（list10_0.5h,list20_0.5h）で読込
        df =(pd.read_csv(outfolder + str('list') + str(id) + '_0.5h.csv', usecols=[3])
    
[/code]

**A社の売上データ**

[![A社の売上データ](https://i.stack.imgur.com/3vXmK.png)](https://i.stack.imgur.com/3vXmK.png)

**B社の売上データ**

[![B社の売上データ](https://i.stack.imgur.com/McQr8.png)](https://i.stack.imgur.com/McQr8.png)

**A社とB社の売上データを抽出して新しいデータフレームを作成したい**

[![A社とB社の売上データを抽出して新しいデータフレームを作成したい](https://i.stack.imgur.com/A999y.png)](https://i.stack.imgur.com/A999y.png)


CC BY-SA 4.0
2020-10-10T15:45:34.003
71080
2020-10-10T21:42:42.060
2020-10-10T16:18:40.810
3060
42209
question
python csv
CSV形式でデータフレームを読み込み、特定のカラムを抽出して新しいデータフレームを作成したい


「稀に売上データに欠損値がある場合」が、例えばある会社は2017/02分の1行が抜けていることがある、という意味であれば、最初に対象の月の`DataFrame`をつくっておいて、そこに1社ずつマージしていけばいいと思います。

[code]

    # ファイル指定
    outfolder = '...r/'
    df_base = DataFrame({
      '月': ['2017/01','2017/02','2017/03','2017/04','2017/05','2017/06','2017/07','2017/08','2017/09','2017/10']
    })
    #loopでデータ読込したい（ID(10と20)はdataというデータフレームで保持している）
    for index, id in enumerate(data['ID'].unique()):
        #フォルダ＋ファイル名（list10_0.5h,list20_0.5h）で読込
        df =(pd.read_csv(outfolder + str('list') + str(id) + '_0.5h.csv', usecols=[3])
        tmp_df = df[['月', '売上']]
        df_base = pd.merge(df_base, tmp_df, on='月', how='left')
        df_base = df_base.rename(columns={'売上': df['name'].unique()[0]})
    
[/code]

※質問のコードを見ると、現状全く処理を実装されていないように見えます。それでは他の人に実装を依頼していることになってしまうので、「このように実装したけど、こういう部分でうまく動かない」というような質問をされた方がよりよいかなぁと思います。


CC BY-SA 4.0
2020-10-10T16:46:36.737
71082
2020-10-10T16:52:59.577
2020-10-10T16:52:59.577
21092
21092
71080
answer


全ての CSV ファイルを読み込んで単一のデータフレームに格納した後、`pandas.DataFrame.groupby()`
で企業別に分割します。次に、分割したデータフレームを「月」をキーにして outer join(`pandas.DataFrame.merge()`)
します。そのため、欠損値は `NaN` になります。

[code]

    import pandas as pd
    from functools import reduce
    
    data = pd.DataFrame({'ID': [10, 20, 10, 20, 10, 20]})
    outfolder = '...r/'
    
    dfs = reduce(
      lambda l, r: pd.merge(l, r, how='outer', on='月'),
      pd.concat([
        pd.read_csv(f'{outfolder}list{id}_0.5h.csv',
          parse_dates=['月'], thousands=',')
        for id in data.ID.unique()])
      .groupby('name')
      .pipe(lambda grp: [
        g[['月', '売上']].rename(columns={'売上': k})
        for k, g in grp
      ])
    )
    
    pd.set_option('display.unicode.east_asian_width', True)
    print(dfs)
    
    =>
    # B社 2017/6/1 の売上データがない(欠損)
    
              月          A        B
    0 2017-01-01   9786.351   6459.0
    1 2017-02-01   8464.354   5586.0
    2 2017-03-01  20291.400  13392.0
    3 2017-04-01  13129.610   8666.0
    4 2017-05-01  33974.490  22423.0
    5 2017-06-01  36048.030      NaN
    6 2017-07-01  48785.010  32198.0
    7 2017-08-01  12199.740   8052.0
    8 2017-09-01   6442.446   4252.0
    9 2017-10-01  47193.700  31148.0
    
[/code]


CC BY-SA 4.0
2020-10-10T21:42:42.060
71087
2020-10-10T21:42:42.060
71080
answer