

以下のようなDataFrame型のデータがあります。  
Pandas DataFrame型での複数列（fish,meet,vegetable）を１列にして、データ内容についても保持したいと考えております。

[code]

     date        member  total  fish  meet vegetable 
     2020/10/1   SATO    2000   600   600 　400
     2020/11/1   KATO    1500   600   400 　400
     2020/12/1   MITO    1800   600   600 　600
    
[/code]

date,member,totalは列で残し、fish,meet,vegetableの３列をまとめて【Grocery】という新規の列を作成したいと考えておりますが、stack等で試してもうまくいきません。  
よい方法があればご教示いただきたくよろしくお願いいたします

なお、Pythonのバージョンは3.9.1を使用しております。


CC BY-SA 4.0
2021-12-22T06:58:33.113
85274
2021-12-23T01:27:09.207
2021-12-23T01:27:09.207
3060
50605
question
python pandas
Pandas DataFrame型での複数列を１列にしたい


> データ内容についても保持

する方法をいくつか例示します。

  1. fish列、meet列(meatの誤字でしょうか？)、vegetable列を合計して値を残す場合は単純にdfの列名で計算することができます。(サンプルコードの1を参照)
  2. 各列をstr.catで文字列として連結することができます。(サンプルコードの2を参照)
  3. 各列を配列化する関数を作成し、applyを使って各行に適用することで配列として保持することができます。(サンプルコードの3を参照)

なお[stack](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.DataFrame.stack.html)は行列の入替なので、今回お求めの目的とは異なるかもしれません。

**サンプルコード**

[code]

    import pandas as pd
    
    df = pd.DataFrame({
         'date': ['2020/10/1', '2020/11/1', '2020/12/1'],
         'member': ['SATO', 'KATO', 'MITO'],
         'total': [2000, 1500, 1800],
         'fish': [600, 600, 600], 
         'meet': [600, 400, 400],
         'vegetable': [400, 400, 600]
    })
    
    # 1.複数列の値を合計する
    df['Grocery'] = df['fish'] + df['meet'] + df['vegetable']
    
    # 2.複数列をハイフン区切りの文字列として連結する
    df['Grocery2'] = df['fish'].astype(str).str.cat([df['meet'].astype(str), df['vegetable'].astype(str)], sep='-')
    
    # 3.複数列を配列として保持する
    def to_list(x):
        return [x.loc['fish'], x.loc['meet'], x.loc['vegetable']]
    
    df['Grocery3'] = df.apply(to_list, axis=1)
    
    print(df)
    
    
[/code]

**実行結果**

[code]

            date member  total  fish  meet  vegetable  Grocery     Grocery2         Grocery3
    0  2020/10/1   SATO   2000   600   600        400     1600  600-600-400  [600, 600, 400]
    1  2020/11/1   KATO   1500   600   400        400     1400  600-400-400  [600, 400, 400]
    2  2020/12/1   MITO   1800   600   400        600     1600  600-400-600  [600, 400, 600]
    
[/code]


CC BY-SA 4.0
2021-12-22T08:17:35.633
85277
2021-12-22T10:57:10.530
2021-12-22T10:57:10.530
9820
9820
85274
answer


##### リストにする場合

[code]

    df['Grocery'] = df[['fish', 'meet', 'vegetable']].values.tolist()
    print(df)
    
    #
            date member  total  fish  meet  vegetable          Grocery
    0  2020/10/1   SATO   2000   600   600        400  [600, 600, 400]
    1  2020/11/1   KATO   1500   600   400        400  [600, 400, 400]
    2  2020/12/1   MITO   1800   600   400        600  [600, 400, 600]
    
[/code]

##### 辞書にする場合

[code]

    df['Grocery'] = df[['fish', 'meet', 'vegetable']].to_dict('records')
    
    #
            date member  total  fish  meet  vegetable                                       Grocery
    0  2020/10/1   SATO   2000   600   600        400  {'fish': 600, 'meet': 600, 'vegetable': 400}
    1  2020/11/1   KATO   1500   600   400        400  {'fish': 600, 'meet': 400, 'vegetable': 400}
    2  2020/12/1   MITO   1800   600   400        600  {'fish': 600, 'meet': 400, 'vegetable': 600}
    
[/code]

##### アクセス方法

`.str` は `pandas.core.strings.accessor.StringMethods`
クラスのインスタンスです(名前の通りアクセサ・メソッド)。なので、以下の様にして各要素にアクセスする事ができます。

[code]

    # リストの場合
    print(df['Grocery'].str[0])
    
    #
    0    600
    1    600
    2    600
    Name: Grocery, dtype: int64
    
    # 辞書の場合
    print(df['Grocery'].str['vegetable'])
    0    400
    1    400
    2    600
    Name: Grocery, dtype: int64
    
[/code]


CC BY-SA 4.0
2021-12-22T18:10:57.383
85281
2021-12-22T18:10:57.383
47127
85274
answer