🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
NumPy

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

Q&A

1回答

1458閲覧

python3.x pandas DataFrame.ilocを用いて階段型に値を取得したり途中を抜かして値を取得したい

hamu_tukareta

総合スコア6

NumPy

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

0グッド

1クリップ

投稿2019/12/02 10:23

前提・実現したいこと

Pythonでたびたび質問させていただいております。

イメージ説明
上記画像のような対称行列やゼロ埋め処理がされている(ヘッダーやカラムがない)csvファイルから、下記画像のように不要な部分を削除したり、NaNで埋めるなどの処理をしたものを取得したいです。具体的には、pythonの(出来れば)pandasを用いて、

イメージ説明

イメージ説明
といった形で行列をcsv形式で保存したいです

発生している問題・エラーメッセージ

通常の行列(df)から長方形型に一部を切り取りたい場合は

df.iloc[0:5,6:8]

とすれば04行目の67列部分を取得できるのですが、今回のような取得したい形が山型だったりする場合に、行列の要素を1個ずつ取得する方法であったり途中の列を抜かして要素を取得する方法が分からずに困っている状態です。

該当のソースコード

9.1113 5.8045 0.17612 -4.7354 0 0 0 0 245.54 161.36 4.739 -126.84 5.8045 11.503 7.4385 0.53569 0 0 0 0 161.36 318.23 206.19 18.775 0.17612 7.4385 14.414 7.5705 0 0 0 0 4.739 206.19 425.68 230.57 -4.7354 0.53569 7.5705 10.136 0 0 0 0 -126.84 18.775 230.57 292.1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

試したこと

pandasのDataFrame.ilocに関するドキュメント(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html)をのぞいたのですが、自分の求めているような操作は見つからなかったです
また、0要素に関してはNaNに値を置き換えるだけならdf.replace([0,0],np.nan)を用いればいいのかな?と考えていますが、可能であれば前提・実現したいことの2枚目の画像のように左詰めをしたいと考えております。

補足情報(FW/ツールのバージョンなど)

以下、バージョンです
pandas==0.25.1
numpy==1.17.2
scipy==1.3.1
scikit-learn==0.21.3
Python 3.7.3

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

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

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

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

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

guest

回答1

0

df.dropna(how='all')を用いると、要素がNaNしかない行を削除することが可能です。
df.dropna(how='all', axis='columns')を用いると、要素がNaNしかない列を削除することが可能です。

np.tril(df)を用いると、要素の右上を0に置換した配列(下三角行列)を取得できます。

Python

1df 2""" 3 0 1 2 3 4 5 6 7 8 9 10 11 40 9.11130 5.80450 0.17612 -4.73540 0 0 0 0 245.540 161.360 4.739 -126.840 51 5.80450 11.50300 7.43850 0.53569 0 0 0 0 161.360 318.230 206.190 18.775 62 0.17612 7.43850 14.41400 7.57050 0 0 0 0 4.739 206.190 425.680 230.570 73 -4.73540 0.53569 7.57050 10.13600 0 0 0 0 -126.840 18.775 230.570 292.100 84 0.00000 0.00000 0.00000 0.00000 0 0 0 0 0.000 0.000 0.000 0.000 95 0.00000 0.00000 0.00000 0.00000 0 0 0 0 0.000 0.000 0.000 0.000 106 0.00000 0.00000 0.00000 0.00000 0 0 0 0 0.000 0.000 0.000 0.000 117 0.00000 0.00000 0.00000 0.00000 0 0 0 0 0.000 0.000 0.000 0.000 12""" 13 14df.iloc[0:4, 0:4] = np.tril(df.iloc[0:4, 0:4]) 15df.iloc[0:4, 8:12] = np.tril(df.iloc[0:4, 8:12]) 16 17df[df.astype(bool)].dropna(how='all').dropna(how='all', axis='columns') 18""" 19 0 1 2 3 8 9 10 11 200 9.11130 NaN NaN NaN 245.540 NaN NaN NaN 211 5.80450 11.50300 NaN NaN 161.360 318.230 NaN NaN 222 0.17612 7.43850 14.4140 NaN 4.739 206.190 425.68 NaN 233 -4.73540 0.53569 7.5705 10.136 -126.840 18.775 230.57 292.1 24"""

投稿2019/12/03 02:29

kirara0048

総合スコア1399

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問