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

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

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

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

Python

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

pandas

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

Q&A

解決済

2回答

720閲覧

DataFrameを空白行で分割したい

Angel76

総合スコア1

Python 3.x

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

Python

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

pandas

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

0グッド

0クリップ

投稿2022/09/15 17:15

前提

以下のようなデータフレームを作成しました。

URLTitleFQDNfreq
ttps://www.youtube.com/aaayoutube動画01ww.youtube.com10
ttps://www.youtube.com/bbbyoutube動画02ww.youtube.com10
ttps://www.youtube.com/cccyoutube動画03ww.youtube.com10
ttps://www.youtube.com/dddyoutube動画04ww.youtube.com10
ttps://www.amazon.co.jp/aaaamazon商品01ww.amazon.co.jp5
ttps://www.amazon.co.jp/bbbamazon商品02ww.amazon.co.jp5
ttps://www.amazon.co.jp/cccamazon商品03ww.amazon.co.jp5
ttps://www.amazon.co.jp/dddamazon商品04ww.amazon.co.jp5
ttps://www.amazon.co.jp/eeeamazon商品05ww.amazon.co.jp5
ttps://twitter.com/aaatwitter01twitter.com2
ttps://twitter.com/bbbtwitter02twitter.com2
ttps://note.com/aaanote01note.com2
ttps://note.com/bbbnote02note.com2

データフレームにはサイトのURL、ページのタイトル、FQDN(URLの一部)、freq(FQDNの値より得られたサイトごとの頻度)を表しています。

※youtubeのfreqの値は表の省略のため異なっています。

実現したいこと

上記データフレームを以下のような形に整形したいです。

URLTitleFQDNfreq
ttps://www.youtube.com/aaayoutube動画01ww.youtube.com10
ttps://www.youtube.com/bbbyoutube動画02ww.youtube.com10
ttps://www.youtube.com/cccyoutube動画03ww.youtube.com10
ttps://www.youtube.com/dddyoutube動画04ww.youtube.com10
 
ttps://www.amazon.co.jp/aaaamazon商品01ww.amazon.co.jp5
ttps://www.amazon.co.jp/bbbamazon商品02ww.amazon.co.jp5
ttps://www.amazon.co.jp/cccamazon商品03ww.amazon.co.jp5
ttps://www.amazon.co.jp/dddamazon商品04ww.amazon.co.jp5
ttps://www.amazon.co.jp/eeeamazon商品05ww.amazon.co.jp5
 
ttps://twitter.com/aaatwitter01twitter.com2
ttps://twitter.com/bbbtwitter02twitter.com2
 
ttps://note.com/aaanote01note.com2
ttps://note.com/bbbnote02note.com2

freqの値をもとに空白の行を追加する処理を行いたいです。
また、freqの値が同じ時はFQDNが異なっているかどうかも確認して処理を行いたいです。

空白行の意図について

最終的にこのデータはCSV形式で書き出して、空白行にも意味を持たせたデータとして他のソフトに渡すことを目的としています。
ですので空白行を用いてデータフレームを整形する方法をご教授ください。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

python

1import pandas as pd 2import io 3 4csv_data = ''' 5URL,Title,FQDN,freq 6ttps://www.youtube.com/aaa,youtube動画01,ww.youtube.com,10 7ttps://www.youtube.com/bbb,youtube動画02,ww.youtube.com,10 8ttps://www.youtube.com/ccc,youtube動画03,ww.youtube.com,10 9ttps://www.youtube.com/ddd,youtube動画04,ww.youtube.com,10 10ttps://www.amazon.co.jp/aaa,amazon商品01,ww.amazon.co.jp,5 11ttps://www.amazon.co.jp/bbb,amazon商品02,ww.amazon.co.jp,5 12ttps://www.amazon.co.jp/ccc,amazon商品03,ww.amazon.co.jp,5 13ttps://www.amazon.co.jp/ddd,amazon商品04,ww.amazon.co.jp,5 14ttps://www.amazon.co.jp/eee,amazon商品05,ww.amazon.co.jp,5 15ttps://twitter.com/aaa,twitter01,twitter.com,2 16ttps://twitter.com/bbb,twitter02,twitter.com,2 17ttps://note.com/aaa,note01,note.com,2 18ttps://note.com/bbb,note02,note.com,2 19''' 20df = pd.read_csv(io.StringIO(csv_data)) 21 22# 23empty = pd.DataFrame([[''] * len(df.columns)] , columns=df.columns) 24dfx = df.groupby(['FQDN', 'freq'], sort=False, group_keys=False)\ 25 .apply(lambda x: pd.concat([x, empty]))\ 26 .reset_index(drop=True)[:-1] 27 28print(dfx) 29 30# 31print(dfx['freq'].map(type)) 320 <class 'int'> 331 <class 'int'> 342 <class 'int'> 353 <class 'int'> 364 <class 'str'> 375 <class 'int'> 386 <class 'int'> 397 <class 'int'> 408 <class 'int'> 419 <class 'int'> 4210 <class 'str'> 4311 <class 'int'> 4412 <class 'int'> 4513 <class 'str'> 4614 <class 'int'> 4715 <class 'int'> 48Name: freq, dtype: object
URLTitleFQDNfreq
ttps://www.youtube.com/aaayoutube動画01ww.youtube.com10
ttps://www.youtube.com/bbbyoutube動画02ww.youtube.com10
ttps://www.youtube.com/cccyoutube動画03ww.youtube.com10
ttps://www.youtube.com/dddyoutube動画04ww.youtube.com10
 
ttps://www.amazon.co.jp/aaaamazon商品01ww.amazon.co.jp5
ttps://www.amazon.co.jp/bbbamazon商品02ww.amazon.co.jp5
ttps://www.amazon.co.jp/cccamazon商品03ww.amazon.co.jp5
ttps://www.amazon.co.jp/dddamazon商品04ww.amazon.co.jp5
ttps://www.amazon.co.jp/eeeamazon商品05ww.amazon.co.jp5
 
ttps://twitter.com/aaatwitter01twitter.com2
ttps://twitter.com/bbbtwitter02twitter.com2
 
ttps://note.com/aaanote01note.com2
ttps://note.com/bbbnote02note.com2

投稿2022/09/15 18:00

編集2022/09/15 18:14
melian

総合スコア19798

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

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

0

分割したい単位でgroupbyし、それぞれに空白行を追加して最後にconcatで連結すればよいです。
なお、列の型はできれば変えたくないので、以下では数値列には-1をセットしています。
また、この手法ではFQDNとfreqが同じ部分が離れた行に複数存在していた場合、それらは1つのブロックにまとまってしまうこと(以下でのfの行)だけ留意ください。

Python

1import pandas as pd 2 3df = pd.DataFrame({'Title':list('abcdef'),'FQDN':list('zzyxxz'), 'freq':[10,10,2,2,2,10]}) 4 5dfs = [] 6empty = pd.DataFrame([['','',-1]], columns=df.columns) # 空白行 7for g, gdf in df.groupby(['FQDN','freq'], sort=False): 8 dfs.append(empty) 9 dfs.append(gdf) 10 11ret = pd.concat(dfs[1:]) # 先頭の空白行は不要 12print(ret) 13""" 14 Title FQDN freq 150 a z 10 161 b z 10 175 f z 10 180 -1 192 c y 2 200 -1 213 d x 2 224 e x 2 23"""

投稿2022/09/15 17:50

編集2022/09/15 17:58
can110

総合スコア38266

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

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

Angel76

2022/09/15 18:36

回答いただきありがとうございました。 今後の学習に役立てていきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問