質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

763閲覧

PandasのDataFrameの列を行番号・列番号とみなして、numpyのarrayを作りたい

gyu-don

総合スコア16

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2021/05/18 09:28

編集2021/05/18 09:31

以下のようなDataFrameがあります。
イメージ説明

このDataFrameをnumpyのarrayに変換したいのですが、このとき、

  • arrayのi行j列目の値をxとしたい
  • 欠損している値は0.0としたい

つまり、

array([[90. , 0. , 0. ], [91. , 91.1, 0. ], [92. , 0. , 92.2]])

のような配列がほしく、単純なforループで書くと

# data: 上記DataFrameとする arr = np.zeros((data['i'].max() + 1, data['j'].max() + 1)) for _, row in data.iterrows(): arr[int(row['i']), int(row['j'])] = row['x']

のようになります。

けれど、この方法だと、DataFrameが巨大になったとき、非常に効率が悪いと思うので、これに相当する処理を効率よく書く方法を教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bsdfan

2021/05/18 11:31

解決済みなのでこちらにコメントさせていただきます。 ループ使わずに、下記のように書けます。 arr = np.zeros((data['i'].max() + 1, data['j'].max() + 1)) arr[data['i'], data['j']] = data['x']
gyu-don

2021/05/18 13:44

たしかに。それでいけますね。気づかなかった…。ありがとうございます。
guest

回答2

0

ベストアンサー

こうです。

python

1>>> import pandas as pd 2>>> import io 3>>> 4>>> indata = '''i j x 5... 0 0 90.0 6... 2 0 92.0 7... 1 1 91.1 8... 1 0 91.0 9... 2 2 92.2''' 10>>> 11>>> with io.StringIO(indata) as f: 12... df = pd.read_csv(f, sep=' +', engine='python') 13... 14>>> print(df) 15 i j x 160 0 0 90.0 171 2 0 92.0 182 1 1 91.1 193 1 0 91.0 204 2 2 92.2 21>>> 22>>> arr = df.pivot(index='i', columns='j').fillna(0).values 23>>> arr 24array([[90. , 0. , 0. ], 25 [91. , 91.1, 0. ], 26 [92. , 0. , 92.2]])

投稿2021/05/18 09:56

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

0

scipy.sparse.csr_matrixを使うと簡潔に書けます。
行列が巨大であれば疎行列のまま扱うほうがよいかもしれません。
参考:Python, SciPy(scipy.sparse)で疎行列を生成・変換

Python

1from scipy.sparse import csr_matrix, csc_matrix, coo_matrix, lil_matrix 2import pandas as pd 3 4df = pd.DataFrame({'i':[0,2,1,1,2], 'j':[0,0,1,0,2], 'x':[90,92,91.1,91,92.2]}) 5 6shape = (max(df['i'])+1, max(df['j'])+1) 7csr = csr_matrix( (df['x'], (df['i'],df['j'])), shape=shape) 8a = csr.toarray() 9print(a) 10#[[90. 0. 0. ] 11# [91. 91.1 0. ] 12# [92. 0. 92.2]]

投稿2021/05/18 09:52

編集2021/05/18 09:54
can110

総合スコア38278

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gyu-don

2021/05/18 10:09

なるほど、確かにこれは疎行列そのものです。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問