3

ネストされた「2D」ディクショナリを Pandas DataFrame に変換することに関する質問への回答を見ました。それは私の問題の解決策ですが、ネストされた辞書を生成する中間ステップをスキップできるかどうか疑問に思っていました。私の入力 input.txtが次のようになっているとしましょう:

A B 1
A C 2
B C 3

中間のネストされた辞書を生成することなく、Pandas または Numpy のいずれかを使用して、それを次の対称行列に変換できますか?

  A B C
A 0 1 2
B 1 0 3
C 2 3 0

作成を避けたいネストされた辞書は次のようになります。

d = {'A':{'B':1,'C':2},'B':{'C':3}}

「マルチインデックスを使用したインデックスの読み取り」に関するIOツールのドキュメントを読んだ後、これを試しました:

import pandas as pd
df = pd.read_csv('input.txt', sep=' ', index_col=[0,1], header=None)

しかし、次のようにすると、2D ヒート マップが表示されません。

import matplotlib.pyplot as plt
plt.pcolor(df)
plt.imshow()
4

1 に答える 1

7

これがはるかに効率的かどうかはわかりませんがpivot、次のようにフレームを転置に追加できます。

df = pd.read_csv("input.txt", header=None, delim_whitespace=True)
df = df.pivot(0,1,2)
df.add(df.T, fill_value=0).fillna(0)

   A  B  C
A  0  1  2
B  1  0  3
C  2  3  0

addとのドキュメントは次のとおりですpivot。これが何が起こっているかです。最初の行は次をdf = pd.read_csv("input.txt", header=None, delim_whitespace=True)返します。

   0  1  2
0  A  B  1
1  A  C  2
2  B  C  3

2 行目は次df = df.pivot(0,1,2)を返します。

1   B   C
0           
A   1   2
B NaN   3

マジックナンバーは01、、、です。新しいフレームのインデックスを作成するために使用する列名です。行名の単なるパンダ用語です。新しいフレームの列を作成するために使用する列名です。Andは、新しいフレームの値を作成するために使用する列名です。2indexcolumnsvaluesindex=0indexcolumns=1values=2

3 行目df.add(df.T, fill_value=0).fillna(0)は、転置を追加して三角行列を対称行列に変換するだけです。戻り値:

   A  B  C
A  0  1  2
B  1  0  3
C  2  3  0
于 2015-05-12T17:14:04.153 に答える