ホーム>source

テキスト文字列の1列に改行で区切られた値が含まれるパンダデータフレームがあります。 各CSVフィールドを分割し、エントリごとに新しい行を作成します。

私のデータフレームは次のようなものです:

Col-1   Col-2
A       Notifications
        Returning Value
        Both
B       mine
        Why Not?

予想される出力は次のとおりです。

Col-1   Col-2
A       Notifications 
A       Returning Value
A       Both
B       mine
B       Why Not?

あなたの答え
  • 解決した方法 # 1

    最初の replace()  文字列 ''   np.nan と  そして、 fillna(method='ffill') を使用します :

    df = pd.DataFrame({'Col-1':['A','','','B',''],
                       'Col-2':['Notifications','Returning Value','Both','mine','Why Not?']})
    df
        Col-1   Col-2
    0   A   Notifications
    1       Returning Value
    2       Both
    3   B   mine
    4       Why Not?
    df['Col-1'] = df['Col-1'].replace('',np.nan).fillna(method='ffill')
    df
        Col-1   Col-2
    0   A   Notifications
    1   A   Returning Value
    2   A   Both
    3   B   mine
    4   B   Why Not?
    
    

  • 解決した方法 # 2

    2番目の列を再構築してシリーズをフラット化し、最初の列と連結するだけです。

    df = pd.DataFrame({'Col-1': ['A', 'B'], 'Col-2': ['Notifications\nReturning Value\nBoth', 'mine\nWhy Not?']})
    
    

    df  表現:

     Col-1                                 Col-2
    0     A  Notifications\nReturning Value\nBoth
    1     B                        mine\nWhy Not?
    
    

    主要部分:

    series = pd.DataFrame(df['Col-2'].str.split('\n').tolist()).stack()
    series.index = series.index.droplevel(1)
    series.name = 'Col-2'
    result = pd.concat([df['Col-1'], series], axis=1)
    
    

    結果:

     Col-1            Col-2
    0     A    Notifications
    1     A  Returning Value
    2     A             Both
    3     B             mine
    4     B         Why Not?
    
    

  • 解決した方法 # 3

    あなたが pd.reset_index() したいIIUC

    データがdfという変数に格納されていると仮定します。

    df = df.reset_index().set_index('Col-1')
    
    

    MultiIndexを作成する簡単な方法を提供していないため、ダミーの例:

    arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
    tuples = list(zip(*arrays))
    index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
    First  second
    bar    one       0.792900
           two      -0.070508
    baz    one      -0.599464
           two       0.334504
    foo    one       0.835464
           two       1.614845
    qux    one       0.674623
           two       1.907550
    
    

    最初の列をインデックスにしたい場合:

    s = s.reset_index().set_index('first')
    print(s)
    
    second         0
    first                 
    bar      one  0.792900
    bar      two -0.070508
    baz      one -0.599464
    baz      two  0.334504
    foo      one  0.835464
    foo      two  1.614845
    qux      one  0.674623
    qux      two  1.907550
    
    

    詳細はこちら:高度なインデックス作成

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ Python変数を「未定義」に設定するにはどうすればよいですか?