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

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

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

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

pandas

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

Q&A

解決済

1回答

3167閲覧

Pythonでテキストファイルの編集

退会済みユーザー

退会済みユーザー

総合スコア0

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

pandas

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

0グッド

0クリップ

投稿2020/02/03 11:09

全国のイベントをまとめたデータフレーム【df_event】から、イベントに携わった会社をvalue_counts()で抽出し、【company.txt】に保存しました。
各会社の繋がりをnetworkxで可視化するための下処理として【期待する結果】のようにテキストファイルを書き換えたいです。

  1. A社、B社、C社

だと、3社の繋がりがあるので
0. A社 B社
0. A社 C社
0. B社 C社

となるようにしたいです。
(重複は削除しません。)

いい方法が浮かばず苦戦しています。。
どなたかご教授をよろしくお願いいたします。。

python

1with open("company.txt", encoding="utf-8") as f: 2 data_lines = f.read() 3 4data_lines = data_lines.replace("2", "") 5data_lines = data_lines.replace("1", "") 6data_lines = data_lines.replace("、", " ") 7 8with open("company.txt", mode="w", encoding="utf-8") as f: 9 f.write(data_lines)

【company.txt】
0. A社、B社、C社
0. 2
0. A社、E社
0. 2
0. D社、F社、G社、I社
0. 2
0. K社、J社、A社
0. 1
0. A社、E社、G社、H社
0. 1

【期待する結果】
0. A社 B社
0. A社 C社
0. B社 C社
0. A社 E社
0. D社 F社
0. D社 G社
0. D社 I社
0. F社 G社
0. F社 I社
0. G社 I社
0. K社 J社
0. K社 A社
0. J社 A社
0. A社 E社
0. A社 G社
0. A社 H社
0. E社 G社
0. E社 H社
0. G社 H社

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

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

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

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

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

guest

回答1

0

ベストアンサー

itertools.combinationsを使うと、ある集合から任意の2個をとる組み合わせを簡単に生成できます。

Python

1import itertools 2 3from io import StringIO 4s = """A社、B社、C社 52 6 7 8 9 10A社、E社 112 12D社、F社、G社、I社 132 14K社、J社、A社 151 16A社、E社、G社、H社 171 18A社 191 20A社、E社 212""" 22data_lines = StringIO(s).read() 23 24data_lines = data_lines.replace("2", "") 25data_lines = data_lines.replace("1", "") 26data_lines = data_lines.replace("、", " ") 27 28# ↑までは質問コードと同じでよい。 29 30data_lines = data_lines.split('\n') 31for line in data_lines: 32 line = line.strip() # 前後の空白除去 33 if line: 34 line = line.split(' ') 35 for c in itertools.combinations(line,2): 36 s = ' '.join(c) 37 print(s) 38""" 39A社 B社 40A社 C社 41B社 C社 42A社 E社 43D社 F社 44D社 G社 45D社 I社 46F社 G社 47F社 I社 48G社 I社 49K社 J社 50K社 A社 51J社 A社 52A社 E社 53A社 G社 54A社 H社 55E社 G社 56E社 H社 57G社 H社 58A社 E社 59"""

投稿2020/02/03 11:24

編集2020/02/03 14:55
can110

総合スコア38260

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

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

退会済みユーザー

退会済みユーザー

2020/02/03 12:16

ご回答ありがとうございます! s = 'A社、B社、C社\n2\nA社、E社\n2\nD社、F社、G社、I社\n2\nK社、J社、A社\n1\nA社、E社、G社、H社\n1' の部分はこの形式でないとダメでしょうか? 【df_event】からvalue_counts()で抽出した返り値をそのまま使うことはできますかm(_ _)m?
can110

2020/02/03 12:25 編集

その部分は、この回答コードをそのままコピペして実行できるようにするためのテストコード部分です。 「# ↑までは質問コードと同じでよい。」 とコメント文に書いているように、その部分は実際には質問コードと同じでよいです。 > 【df_event】からvalue_counts()で抽出した返り値をそのまま使うことはできますかm(_ _)m? df_eventの詳細分からないので何とも云えませんが、おそらくdf_eventからうまく加工して、"company.txt"を介さずに最終的なdfを作りこむことはそれほど難しくないように思えます。
退会済みユーザー

退会済みユーザー

2020/02/03 13:10

なるほど! ありがとうございます! ちなみに上記コードは、会社名がひとつの場合はスキップされますか??
can110

2020/02/03 13:15

実際のコードを動かしてみればわかると思いますが 1つの要素から2つを取り出す組み合わせは存在しないので、ひとつの場合はスキップされます。
退会済みユーザー

退会済みユーザー

2020/02/03 13:22

そうでしたか。。 実際のデータで動かしてみたところ下記のような結果になってしまったので、試行錯誤してみます! ありがとうございましたm(_ _)m A社 A社 A社 A社 (空白) (空白) (空白) (空白) ・ ・ ・ ・
can110

2020/02/03 13:29

会社名がひとつ(「A社」という行がある)の場合、どのような出力が得たいのかによりますが 「A社 A社」と出したいなら line = line.split(' ') if len(line) == 1: s = '{} {}'.format( line[0], line[0]) else: # 略 のようにすればよいかと思います。
退会済みユーザー

退会済みユーザー

2020/02/03 13:48

いえ、会社名がひとつの場合はスキップしたいと思っていました! なので上記コードでいけると思ったのですが、、
can110

2020/02/03 14:00

回答コードのテストデータ部分を分かりやすいように修正&「A社」の行を追加しました。 処理部分のコードはそのままで変わってませんが 「A社」の行はスキップされます。
退会済みユーザー

退会済みユーザー

2020/02/03 14:38

ありがとうございます! もしかして、実際のテキストデータは会社名と数字の間に空白スペースがあるのですが、それが問題でしょうか?
退会済みユーザー

退会済みユーザー

2020/02/03 14:40

空白スペースはかなり長くありますm(__)m
can110

2020/02/03 14:56 編集

実際のテキストデータのカタチがよく分かりませんが「空白スペース」とは改行のみの行ということですか? であれば、処理のどこかのタイミングで空行を除去するか処理中にスキップすればよいかと思います。 コード修正しました。
退会済みユーザー

退会済みユーザー

2020/02/03 15:01

失礼しましたm(__)m 半角のスペースが大量にあります。。
退会済みユーザー

退会済みユーザー

2020/02/03 15:03

data_lines = data_lines.replace("、", " ") の前に data_lines = data_lines.replace(" ", "") を入れたら解決できました!! 助かりました。ありがとうございましたm(__)m
can110

2020/02/03 15:06

解決してよかったです。
退会済みユーザー

退会済みユーザー

2020/02/04 01:42

ちなみに、、 〈該当コード〉 f = ' '.join(c) print(s) with open("company.txt", mode="w", encoding="utf-8") as f: f.write(line) とするとテキストファイルが白紙で保存されてしまうのですが解決方法はありますでしょうかm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問