次のような形式で正方行列を作成する方法を理解するのに苦労しています。
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のキャスト関数に似たものがありますか?これはこれを大幅に高速化できますか?
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.crosstab
(agfunc='sum'
を含む)は、関連付けられた値を合計することによって重複ペアを集約します。投稿された例には重複ペアはありませんが、values
パラメーターを使用する場合は、重複を集約する方法を指定する必要があります。
また、df.pivot
には列ラベルが渡されますが、pd.crosstab
には配列のようなもの(df
の列全体など)が渡されます。 df.iloc[:, i]
は、i
のdf
番目の列です。