bugfix> python-3.x > 投稿

300個のデータフレームをマージしようとしています。私の制約は、すべてに共通の列が4つしかないことで、残りは共通である場合とそうでない場合があります。マージ中に新しい列が検出されるたびにデータフレームに列を追加する必要があります。 同じもののおもちゃのデータセットをシミュレートしました。

データフレーム1:

Column_A : 'a', 'a', 'b', 'b', 'd'
Column_CounterName : 'Type1', 'Type2', 'Type3', 'Type4', 'Type1'
Column_CounterValue : 100, 300, 356, 288, 233, 453

Dataframe2:

Column_A : 'm', 'm', 'n', 'n', 'o'
Column_CounterName : 'Type1', 'Type5', 'Type6','Type5', 'Type1'
Column_CounterValue : 100, 300, 356, 846, 7455

マージされたデータフレームは次のとおりです。

Column_A : 'a', 'b', 'd', 'm', 'n', 'o'
Type1 : 100, null, 453, 100, null, 7455
Type2 : 300, null, null, null, null, null
Type3 : null, 356, null, null null, null
Type4 : null, 233, null, null, null, null 
Type5 : null, null, null, 356, 846, null
Type6 : null, null, null, 356, null, null

Column_A、Type1、....はすべて列名です。

どうすればいいですか?

また、マージ後にNull値を入力するにはどうすればよいですか。

回答 1 件
  • set_index が必要だと思う   concat と   A によるすべてのDataFrameへの参加  カラム:

    dfs = [df1, df2]
    #for each DataFrame create index by A column
    dfs = [x.set_index('A') for x in dfs]
    #for join by more columns
    #dfs = [x.set_index(['A', 'col1', 'col2']) for x in dfs]
    df = pd.concat(dfs, axis=1).rename_axis('A').reset_index()
    print (df)
         A    B    D
    0  'a'  1.0  NaN
    1  'b'  2.0  NaN
    2  'c'  3.0  NaN
    3  'd'  4.0  NaN
    4  'm'  NaN  's'
    5  'n'  NaN  'd'
    6  'o'  NaN  'k'
    
    

    編集:

    dfs = [df1, df2]
    #for each DataFrame create index by A column
    dfs = [x.set_index(['Column_A','Column_CounterName']) for x in dfs]
    df = pd.concat(dfs)['Column_CounterValue'].unstack().rename_axis(None, 1).reset_index()
    print (df)
      Column_A   Type1  Type2  Type3  Type4  Type5  Type6
    0        a   100.0  300.0    NaN    NaN    NaN    NaN
    1        b     NaN    NaN  356.0  233.0    NaN    NaN
    2        d   453.0    NaN    NaN    NaN    NaN    NaN
    3        m   100.0    NaN    NaN    NaN  300.0    NaN
    4        n     NaN    NaN    NaN    NaN  846.0  356.0
    5        o  7455.0    NaN    NaN    NaN    NaN    NaN
    
    

    取得する場合:

    ValueError: Index contains duplicate entries, cannot reshape

    ペア Column_A の重複を意味します  および Column_CounterName  お気に入り:

    d1 = {'Column_A' : ['a', 'a', 'b', 'b', 'd'],
    'Column_CounterName' : ['Type1', 'Type1', 'Type3', 'Type4', 'Type1'],
    'Column_CounterValue' : [100, 300, 356,  233, 453]}
    d2 = {'Column_A' :[ 'm', 'm', 'n', 'n', 'o'],
    'Column_CounterName' : ['Type1', 'Type5', 'Type6','Type5', 'Type1'],
    'Column_CounterValue' : [100, 300, 356, 846, 7455]}
    df1 = pd.DataFrame(d1)
    print (df1)
      Column_A Column_CounterName  Column_CounterValue
    0        a              Type1                  100 <- same a, Type1
    1        a              Type1                  300 <- same a, Type1
    2        b              Type3                  356
    3        b              Type4                  233
    4        d              Type1                  453
    df2 = pd.DataFrame(d2)
    print (df2)
      Column_A Column_CounterName  Column_CounterValue
    0        m              Type1                  100
    1        m              Type5                  300
    2        n              Type6                  356
    3        n              Type5                  846
    4        o              Type1                 7455
    
    

    次に、可能な解決策は、複製されたペアを集約します。によって mean

    df = (pd.concat(dfs)['Column_CounterValue']
            .groupby(level=[0,1])
            .mean()
            .unstack()
            .rename_axis(None, 1)
            .reset_index())
    print (df)
      Column_A   Type1  Type3  Type4  Type5  Type6
    0        a   200.0    NaN    NaN    NaN    NaN <- (100 + 300) / 2 = 200
    1        b     NaN  356.0  233.0    NaN    NaN
    2        d   453.0    NaN    NaN    NaN    NaN
    3        m   100.0    NaN    NaN  300.0    NaN
    4        n     NaN    NaN    NaN  846.0  356.0
    5        o  7455.0    NaN    NaN    NaN    NaN
    
    

あなたの答え