2016-09-14 9 views
1

私のGooglefuが失敗しました!グラフノードのレベルとエッジの正方行列を持つPandas DataFrame

Iは、フォームのパンダDataFrameを有する:

Level 1 Level 2 Level 3 Level 4 
------------------------------------- 
A   B   C   NaN 
A   B   D   E 
A   B   D   F 
G   H   NaN  NaN 
G   I   J   K 

それは基本的に高次のレベルに下位のレベルからの発信エッジを示すレベルでグラフのノードを含みます。 Iは、フォームの新しいデータフレームを作成/データフレームを変換したい:

 A B C D E F G H I J K 
    --------------------------------------------- 
A | 0 1 0 0 0 0 0 0 0 0 0 
B | 0 0 1 1 0 0 0 0 0 0 0 
C | 0 0 0 0 0 0 0 0 0 0 0 
D | 0 0 0 0 1 1 0 0 0 0 0 
E | 0 0 0 0 0 0 0 0 0 0 0 
F | 0 0 0 0 0 0 0 0 0 0 0 
G | 0 0 0 0 0 0 0 1 1 0 0 
H | 0 0 0 0 0 0 0 0 0 0 0 
I | 0 0 0 0 0 0 0 0 0 1 0 
J | 0 0 0 0 0 0 0 0 0 0 1 
K | 0 0 0 0 0 0 0 0 0 0 0 

1を含有する細胞は、対応する列に対応する行からの発信エッジを示しています。パンダでループや条件なしにこれを達成するためのPythonの方法はありますか?

答えて

1

このコードを試してみてください。

df = pd.DataFrame({'level_1':['A', 'A', 'A', 'G', 'G'], 'level_2':['B', 'B', 'B', 'H', 'I'], 
    'level_3':['C', 'D', 'D', np.nan, 'J'], 'level_4':[np.nan, 'E', 'F', np.nan, 'K']}) 

あなたの入力データフレームは、次のとおりです。

level_1 level_2 level_3 level_4 
0  A  B  C  NaN 
1  A  B  D  E 
2  A  B  D  F 
3  G  H  NaN  NaN 
4  G  I  J  K 

、溶液がある:

# Get unique values from input dataframe and filter out 'nan' values 
list_nodes = [] 
for i_col in df.columns.tolist(): 
    list_nodes.extend(filter(lambda v: v==v, df[i_col].unique().tolist())) 

# Initialize your result dataframe 
df_res = pd.DataFrame(columns=sorted(list_nodes), index=sorted(list_nodes)) 
df_res = df_res.fillna(0) 

# Get 'index-column' pairs from input dataframe ('nan's are exluded) 
list_indexes = [] 
for i_col in range(df.shape[1]-1): 
    list_indexes.extend(list(set([tuple(i) for i in df.iloc[:, i_col:i_col+2]\ 
     .dropna(axis=0).values.tolist()]))) 

# Use 'index-column' pairs to fill the result dataframe 
for i_list_indexes in list_indexes: 
    df_res.set_value(i_list_indexes[0], i_list_indexes[1], 1) 

そして、最終的な結果は次のとおりです。

A B C D E F G H I J K 
A 0 1 0 0 0 0 0 0 0 0 0 
B 0 0 1 1 0 0 0 0 0 0 0 
C 0 0 0 0 0 0 0 0 0 0 0 
D 0 0 0 0 1 1 0 0 0 0 0 
E 0 0 0 0 0 0 0 0 0 0 0 
F 0 0 0 0 0 0 0 0 0 0 0 
G 0 0 0 0 0 0 0 1 1 0 0 
H 0 0 0 0 0 0 0 0 0 0 0 
I 0 0 0 0 0 0 0 0 0 1 0 
J 0 0 0 0 0 0 0 0 0 0 1 
K 0 0 0 0 0 0 0 0 0 0 0 
関連する問題