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

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

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

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

Python 3.x

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

pandas

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

Q&A

解決済

1回答

5440閲覧

Python,pandas:指定した場所に空白の行を追加したい

oshima2000

総合スコア2

JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

Python 3.x

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

pandas

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

0グッド

1クリップ

投稿2022/08/24 12:24

編集2022/08/25 02:29

Python超初心者です。

事業者名路線名駅名
JR東日本東海道本線東京
JR東日本東海道本線丸ノ内線
JR東日本東海道本線東海道新幹線
JR東日本東海道本線有楽町
JR東日本東海道本線有楽町線
JR東日本東海道本線新橋
.........

以上のようなデータを扱っており、以下のように空白の行を挿入して駅ごとにデータを区切りたいと考えています(都合上、接続路線名も駅名と同じ列になってしまっています)。

事業者名路線名駅名
JR東日本東海道本線東京
JR東日本東海道本線丸ノ内線
JR東日本東海道本線東海道新幹線
NaNNaNNaN
JR東日本東海道本線有楽町
JR東日本東海道本線有楽町線
NaNNaNNaN
JR東日本東海道本線新橋
.........

そこで、駅名が記載された行を特定するために「線」「鉄道」「電鉄」「モノレール」というワードを含まない行を検索、スライスしてその末尾に空白の行を追加するループを書いてみたのですが、うまくいきません。

for i in df['駅名']: x = ~df['駅名'].str.contains('線|鉄道|電鉄|モノレール') #駅名の行を特定 idx = df[x == 1] if x is True: #駅名の場合に条件分岐 y = idx.index[0] #最初の駅名のインデックス取得(最初の表で言うと、「東京」の行番号を取得) z = idx.index[1] #二番目の駅名のインデックス取得(最初の表で言うと、「有楽町」の行番号を取得) df1 = df.iloc[y:z-1] #スライス(最初の表で言うと、「東京」から「東海道新幹線」までをスライス) df1.append(pandas.Series()) #空白の行を追加

エラーメッセージなども出ないのですが、実行しても何も変化しません。
挿入したい行番号はわかっているので転置→insertも試しましたが、量が多すぎてエラーが出てしまいました。

初心者のため理解不足・調査不足な点も多いかと思いますが、お力添えいただけると嬉しいです。

以下追記

投稿の段階では記載していませんでしたが、このデータにはさらに

事業者名路線名駅名下り線乗客数
JR東日本東海道本線東京16851469
JR東日本東海道本線丸ノ内線0
JR東日本東海道本線東海道新幹線3491353
JR東日本東海道本線有楽町11113994
JR東日本東海道本線有楽町線0
JR東日本東海道本線新橋15125426
............

のような列がさらに9列ほどあり、乗降客数の合計(表内の東京駅であれば東京+丸ノ内線+東海道新幹線)を各駅ごとに出すのが私の本来の目的です。
そこで駅ごとに空白の行(その後0.1に置換)を挟み、

result = 0 for i in df['下り線乗客数']: result = result + i if i == 0.1: result = result - 0.1 print(result) result = result * 0 df1 = result print(df1)

という作業を行うことで各駅ごとの合計を求めようとしていたため、目印となる空白の行を挿入しようとしています(もっと効率的な方法があるとは思いますが、自分で考えられる方法がこれしかありませんでした)。

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

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

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

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

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

meg_

2022/08/24 12:55

> 以下のように空白の行を挿入して駅ごとにデータを区切りたいと考えています スプレッドシートやプレゼン資料のように見栄え良くするために空白行を挿入するようなことは通常データ分析では行いませんが、本当にしたいことは「空白の行を挿入」なのでしょうか?
TakaiY

2022/08/24 13:43

僕もmeg_さんと同じことを思いました。 空行を入れる目的は何でしょう?
oshima2000

2022/08/25 11:38

目的について、質問内容に追記させていただきました。
meg_

2022/08/25 11:57

やりたい事はgroupby()で実現できそうな気がします(開示されている情報が一部のため違うかもしれませんが)。ですが、質問者さんなりのやり方でやりたい事が実現できるのであればそれも良いかと思います。
oshima2000

2022/08/25 15:31

お返事ありがとうございます。とりあえず今回は目的だった計算まで実現できました。 なるほど、groupby()を使う方法もあるのですね。参考にさせていただきます。
guest

回答1

0

ベストアンサー

※ 1行目は適宜削除して下さい。

python

1import pandas as pd 2import numpy as np 3import io 4 5csv_data = ''' 6事業者名,路線名,駅名 7JR東日本,東海道本線,東京 8JR東日本,東海道本線,丸ノ内線 9JR東日本,東海道本線,東海道新幹線 10JR東日本,東海道本線,有楽町 11JR東日本,東海道本線,有楽町線 12JR東日本,東海道本線,新橋 13''' 14df = pd.read_csv(io.StringIO(csv_data)) 15 16# 17idx = ~df['駅名'].str.contains(r'(?:線|鉄道|電鉄|モノレール)$', regex=True) 18insert = pd.DataFrame([[np.nan] * len(df.columns)] , columns=df.columns) 19df = df.groupby(idx.cumsum(), group_keys=False).apply(lambda x: pd.concat([insert, x])).reset_index(drop=True) 20print(df)
事業者名路線名駅名
nannannan
JR東日本東海道本線東京
JR東日本東海道本線丸ノ内線
JR東日本東海道本線東海道新幹線
nannannan
JR東日本東海道本線有楽町
JR東日本東海道本線有楽町線
nannannan
JR東日本東海道本線新橋

投稿2022/08/24 13:01

編集2022/08/24 13:11
melian

総合スコア19761

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

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

oshima2000

2022/08/25 02:02

ご回答ありがとうございます。頂いたコードで実現することができました! 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問