2017-11-22 12 views
1

"n x n"と "m x n"(m < n)の2つのパンダデータフレームがあります。たとえば:2つのデータフレームを正方行列のデータフレームに連結する

df1 = pd.DataFrame([[0,1,0,1],[1,0,0,1],[0,0,0,1],[1,1,1,0]]) 
df2 = pd.DataFrame([[1,1,1,0],[1,1,0,1]]) 

私は、データフレームの上に連結することにより、正方行列のデータフレームを取得したいのですが:

df3 = foo(df1, df2) 
print df3.values 

これは、次の行列のように印刷する必要があります。

[[0,1,0,1,1,1], 
[1,0,0,1,1,1], 
[0,0,0,1,1,0], 
[1,1,1,0,0,1], 
[1,1,1,0,0,0], 
[1,1,0,1,0,0]] 

連結ののロジックはこのようなものです:

  1. 正方行列の左上の部分は、それの右上の部分がDF2
  2. の転置から来
  3. DF1から来ています
  4. 左下がdf2から来る
  5. 残りのすべての要素(右下部分)はゼロです。

上記のロジック(fooメソッド)を実装するにはどうすればよいですか?ここで

答えて

0

fooのサンプルです:

def foo(_df1,_df2): 
    df1 = _df1.reset_index(drop=True) #to make sure the index is ordered 
    df2 = _df2.reset_index(drop=True) #to make sure the index is ordered 
    df2_transpose = df2.transpose().reset_index(drop=True) #reset the index to match the join below 

    df_upper = df1.join(df2_transpose,rsuffix="_") #add suffix for additional columns 
    df_upper.columns = [i for i in range(df_upper.shape[1])] #reset column names to int 

    df = pd.concat([df_upper,df2]) #fill the bottom left 

    df.fillna(0,inplace=True) #fill with 0 the bottom right 

    return df 
0

関数foo:

def foo(df1_data,df2_data): 

    df_test = pd.concat([df1_data,df2_data]) 
    a = np.concatenate((df2_data.values.T,np.zeros(shape = (df_test.values.shape[0] - df_test.values.shape[1],df2_data.values.shape[0])))) 
    final_array = np.append(df_test.values,a, axis=1).astype(int) 
    df3_data = pd.DataFrame(final_array) 

    return df3_data 

df3 = foo(df1,df2) 
関連する問題