web-dev-qa-db-ja.com

3列の正方形のデータフレーム/行列を作成する方法-Python

次のような形式で正方行列を作成する方法を理解するのに苦労しています。

a a 0
a b 3
a c 4
a d 12
b a 3 
b b 0
b c 2
...

次のようなものに:

  a b c d e
a 0 3 4 12 ... 
b 3 0 2 7 ... 
c 4 3 0 .. .
d 12 ...  
e . .. 

パンダで。私は、うまくいくと思うが、forループを使用するたびに最初からすべての値について各列と行を反復処理する必要があるため、実行に永遠にかかるメソッドを開発しました。私は間違いなくここで車輪の再発明をしているような気がします。列と行がいくつあるかを考えると、これは私のデータセットにとっても現実的ではありません。 pythonにRのキャスト関数に似たものがありますか?これはこれを大幅に高速化できますか?

6
WolVes

df.pivot を使用できます:

import pandas as pd

df = pd.DataFrame([['a', 'a', 0],
                   ['a', 'b', 3],
                   ['a', 'c', 4],
                   ['a', 'd', 12],
                   ['b', 'a', 3],
                   ['b', 'b', 0],
                   ['b', 'c', 2]], columns=['X','Y','Z'])

print(df.pivot(index='X', columns='Y', values='Z'))

収量

Y    a    b    c     d
X                     
a  0.0  3.0  4.0  12.0
b  3.0  0.0  2.0   NaN

ここで、index='X'df.pivot'X'というラベルの付いた列をインデックスとして使用するように指示し、columns='Y''Y'というラベルの付いた列を列インデックスとして使用するように指示します。

pivotおよびその他の再形成方法の詳細については、 ドキュメント を参照してください。


または、 pd.crosstab :を使用することもできます。

print(pd.crosstab(index=df.iloc[:,0], columns=df.iloc[:,1], 
                  values=df.iloc[:,2], aggfunc='sum'))

df.pivotペアが一意であることを期待する(a1, a2)とは異なり、pd.crosstabagfunc='sum'を含む)は、関連付けられた値を合計することによって重複ペアを集約します。投稿された例には重複ペアはありませんが、valuesパラメーターを使用する場合は、重複を集約する方法を指定する必要があります。

また、df.pivotには列ラベルが渡されますが、pd.crosstabには配列のようなもの(dfの列全体など)が渡されます。 df.iloc[:, i]は、idf番目の列です。

13
unutbu