77538


pandasの `=` の動きを理解しないまま、推測でコードを書いています。

まず、下記のように書くと動くことが確認できました。

[code]

    import matplotlib.pyplot as plt
    import pandas as pd
    
    df = pd.DataFrame({
      'date': ['01-01', '01-02', '01-03', '02-01', '02-01'],
      'value': [10000, 5000, 1000, 500, 100]
    })
    
    df['group'] = df['date']
    
    g_df = df.groupby('group')
    g_df.head()
    
[/code]

結果:  
[![画像の説明をここに入力](https://i.stack.imgur.com/P2awF.png)](https://i.stack.imgur.com/P2awF.png)

また下記のようにすると動くことも確認できました。

[code]

    import matplotlib.pyplot as plt
    import pandas as pd
    
    df = pd.DataFrame({
      'date': ['01-01', '01-02', '01-03', '02-01', '02-01'],
      'value': [10000, 5000, 1000, 500, 100]
    })
    
    df['group'] = '01-01'.split('-')[0]
    
    g_df = df.groupby('group')
    g_df.head()
    
[/code]

結果:  
[![画像の説明をここに入力](https://i.stack.imgur.com/qt3x7.png)](https://i.stack.imgur.com/qt3x7.png)

なるほど。であれば、

[code]

    df['group'] = df['date'].split('-')[0]
    
[/code]

とすればうまくいくのかと思ったのですが、これはエラーになりました。

> AttributeError: 'Series' object has no attribute 'split'

うーん。文字列とおもっていたのにどうやら私が操作していたのは、`Series`のようだと思い、

[pandasで'DataFrame' object has no attribute
'split'のエラーを解決したい](https://ja.stackoverflow.com/questions/66717/pandas%E3%81%A7dataframe-
object-has-no-attribute-
split%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%9F%E3%81%84)

を見てみて `str` というのがあるのかと思って下記を試しました。

[code]

    df['group'] = df['date'].str.split('-')[0]
    
[/code]

今度は、

> ValueError: Length of values (2) does not match length of index (5)

というエラーでした。

試しに、

[code]

    df['group'] = df['date'].str
    
    g_df = df.groupby('group')
    g_df.head()
    
[/code]

としてみると

結果:  
[![画像の説明をここに入力](https://i.stack.imgur.com/N7IIo.png)](https://i.stack.imgur.com/N7IIo.png)

となっており、`pandas`の文字列関係のオブジェクトが入っているよです。

どうすれば、各レコードごとのデータを文字列としてsplitで加工し、新しい列を追加できるのでしょうか？


CC BY-SA 4.0
2021-06-14T03:50:23.933
77537
2021-06-14T04:38:18.047
9008
question
python pandas
ValueError: Length of values (2) does not match length of index (5) が起こる


例えばこちらの記事の回答に書いた最後の方法で出来ます。  
[Excelの日付フォーマットを変換の回答](https://ja.stackoverflow.com/a/76083/26370)

こんな風になります。

[code]

    df['group'] = df['date'].apply(lambda _: _.split('-')[0])
    
[/code]

* * *

同様に@metroploisさんコメントの方法だとこちらになります。

[code]

    df['group'] = df['date'].str.split('-', expand=True)[0]
    
[/code]

* * *

他に分割した両方とも使いたい場合は、上記@metroploisさんコメントの方法を使って、単純には代入できないので`pd.concat`で元のdfと結合するという方法があります。  
[pandasの文字列を区切り文字や正規表現で複数の列に分割](https://note.nkmk.me/python-pandas-split-
extract/)

こんな風になります。

[code]

    df = pd.concat([df,df['date'].str.split('-', expand=True)],axis=1)
    df.rename(columns={0: 'group', 1: 'subgroup'}, inplace=True)
    
[/code]


CC BY-SA 4.0
2021-06-14T04:04:39.483
77538
2021-06-14T04:38:18.047
2021-06-14T04:38:18.047
26370
26370
77537
answer