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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

pandas

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

Q&A

解決済

3回答

645閲覧

Pandas、DataFrameで特定の行に差し掛かるたびに、列方向に変換する処理ができず困ってます・・・

SAMI1220

総合スコア-1

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

pandas

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

0グッド

0クリップ

投稿2021/11/12 13:31

前提・実現したいこと

データフレームで、特定の行に差し掛かるたびに、列方向に変換する処理が実現できず悩んでます・・・

現在以下のようなDataFrame(csv)です。
※26行目で切れてますが、1000以上の行があります

イメージ説明

このデータの打順の列には1の数値が100行以上含まれてます。
打順の列で、次の1までのデータを列方向に変換する処理を繰り返して、以下のようなデータにしたいのですが、コードが思い浮かばず困っております。

イメージ説明

現在の行数がかなり多いため、なるべく簡単に変換する方法を教えていただきたいです。

ちなみに、列方向に追加した時のカラム名は[辰己_打順][辰己_位置][辰己_打数]のように選手名を入れるように変換できるとありがたいです。

説明がわかりにくいかもしれないので、恐縮ですが、アドバイスいただけると幸いです。
よろしくお願い申し上げます。

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

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

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

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

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

ppaul

2021/11/12 13:55

12304567809の次は12304567089としたいのですか? それとも別の並べ方をしたいのですか?
SAMI1220

2021/11/12 14:29

> 12304567809の次は12304567089としたいのですか? はい。そのようにしたいです。 その場合、列の名前がややこしくなりそうですよね・・・ もし難しければ、打順の0の行を削除して123456789だけにして、繰り返す方法に簡略化することも考えてます。
guest

回答3

0

ベストアンサー

python

1print(df) 2# 3 打順 選手名 打数 打率 40 1 辰巳 4 0.250 51 2 小深田 5 0.600 62 3 島内 3 0.333 73 0 武藤 0 0.000 84 4 浅村 5 0.200 95 5 茂木 3 0.333 106 6 鈴木 4 0.250 117 7 田中和 3 0.000 128 8 小郷 3 0.333 139 0 横尾 0 0.000 1410 9 太田 4 0.250 1511 1 辰巳 5 0.286 1612 2 小深田 5 0.385 1713 3 島内 4 0.333 1814 0 武藤 0 0.000 1915 4 浅村 3 0.333 2016 5 茂木 4 0.444 2117 6 鈴木 3 0.200 2218 7 小郷 2 0.200 2319 0 岩見 1 0.000 2420 8 田中和 4 0.091 2521 9 太田 4 0.400 2622 1 辰巳 4 0.389 2723 2 小深田 4 0.294 2824 3 島内 2 0.286 29 30# split dataframe 31block_idx = (df['打順'] == 1).cumsum() 32dfx = pd.concat([pd.DataFrame(df.values.reshape(1, -1)) for _, df in df.groupby(block_idx)]) 33 34print(dfx) 35 36# 37 0 1 2 3 4 5 6 7 ... 36 37 38 39 40 41 42 43 380 1 辰巳 4 0.25 2 小深田 5 0.6 ... 0 横尾 0 0.0 9 太田 4 0.25 390 1 辰巳 5 0.286 2 小深田 5 0.385 ... 8 田中和 4 0.091 9 太田 4 0.4 400 1 辰巳 4 0.389 2 小深田 4 0.294 ... NaN NaN NaN NaN NaN NaN NaN NaN 41 42[3 rows x 44 columns]

列方向に追加した時のカラム名は[辰己_打順][辰己_位置][辰己_打数]のように選手名を入れるように…

ブロックによって打順が異なるので、ブロック毎にデータフレームを作ってリストに入れておくという対応が考えられます。

投稿2021/11/12 20:55

編集2021/11/12 21:11
melian

総合スコア20655

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

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

0

ご丁寧にありがとうございます。

このような方法があるのですね・・・とても参考になりました。

教えていただいたどちらの方法も良かったのですが、今回は先に教えていただいたのでベストアンサーとさせていただきます。

カラムだけ上手いように試してみます

投稿2021/11/14 14:59

SAMI1220

総合スコア-1

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

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

0

切れ目が必ず11行ごとなら以下でできます。
(melianさんのデータを使わせていただきました)

python

1>>> LENGTH = 11 2>>> result = pd.concat([df[df.index%LENGTH==i].reset_index(drop=True) for i in range(LENGTH)], axis=1) 3>>> print(result) 4 打順 選手名 打数 打率 打順 選手名 打数 打率 打順 ... 打率 打順 選手名 打数 打率 打順 選手名 打数 打率 50 1 辰巳 4 0.250 2 小深田 5 0.600 3 ... 0.333 0.0 横尾 0.0 0.000 9.0 太田 4.0 0.25 61 1 辰巳 5 0.286 2 小深田 5 0.385 3 ... 0.000 8.0 田中和 4.0 0.091 9.0 太田 4.0 0.40 72 1 辰巳 4 0.389 2 小深田 4 0.294 3 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN 8 9[3 rows x 44 columns]

切れ目が必ず11行ごとではなく、必ず1のところで切れるのであればmelianさんのやり方の方が良いでしょう。

投稿2021/11/12 23:07

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問