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

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

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

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

Q&A

解決済

3回答

1084閲覧

python pandas でデータが重複生成されてしまうのを解決したい

gaww

総合スコア0

Python

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

0グッド

0クリップ

投稿2020/06/15 21:05

編集2020/06/16 21:46

前提・実現したいこと

データを集計して定型フォーマットのCSVを作ろうとしています。

group(1)

012grp
1N登録太郎1
2EMAILaaa@xxx.jp1
3EMAILbbb@xxx.jp1

group(2)

012grp
4N登録次郎2
5EMAILccc@xxx.jp2
6EMAILddd@xxx.jp2

group(3)

012grp
7N登録三郎3
8EMAILeee@xxx.jp3
9EMAILfff@xxx.jp3
10EMAILggg@xxx.jp3

group(1)+group(2)+group(3)を結合して以下のような表を作りたい

01234
1N登録太郎登録次郎登録三郎
2EMAILaaa@xxx.jpccc@xxx.jpeee@xxx.jp
3EMAILbbb@xxx.jpddd@xxx.jpfff@xxx.jp
4EMAILNaNNaNggg@xxx.jp

しかし、結合merge()またはjoinを使って結合してみるとキーが丸ごと増えていってしまう。
これだと、2件の結合なら手動で消せるけれども1000件以上あると考えると手におえない。

01234
1N登録太郎登録次郎登録三郎
2EMAILaaa@xxx.jpccc@xxx.jpeee@xxx.jp
3EMAILbbb@xxx.jpccc@xxx.jpfff@xxx.jp
4EMAILaaa@xxx.jpddd@xxx.jpggg@xxx.jp
5EMAILbbb@xxx.jpddd@xxx.jpeee@xxx.jp
6EMAILaaa@xxx.jpccc@xxx.jpfff@xxx.jp
7EMAILbbb@xxx.jpccc@xxx.jpggg@xxx.jp
8EMAILaaa@xxx.jpddd@xxx.jpeee@xxx.jp
9EMAILbbb@xxx.jpddd@xxx.jpfff@xxx.jp

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

pyhonのpandasでデータを集計していますが、EMAIL欄に同じインデックス名称で中身の違うものを結合しようとすると、データが重複して生成されていってしまいます。 pd.merge後のメールアドレスデータが重複生成されないようにしたい。

該当のソースコード

python

1 2grp_groupby.get_group(1) 3 4    label 1 grp 51 N 登録太郎 1 62 EMAIL aaa@xxx.jp 1 73 EMAIL bbb@xxx.jp 1 8 9 10grp_groupby.get_group(2) 11 12 label 1 grp 134 N 登録二郎 2 145 EMAIL ccc@xxx.jp 2 156 EMAIL ddd@xxx.jp 2 16 17 18df_test = pd.merge(grp_groupby.get_group(1),grp_groupby.get_group(2),on='label',how='outer') 19 20 label 1_x grp_x 1_y grp_y 211 FN 登録太郎 1.0 登録二郎様 2 222 EMAIL aaa@xxx.jp 1.0 ccc@xxx.jp 2 233 EMAIL bbb@xxx.jp 1.0 ccc@xxx.jp 2 244 EMAIL aaa@xxx.jp 1.0 ddd@xxx.jp 2 255 EMAIL bbb@xxx.jp 1.0 ddd@xxx.jp 2 26

試したこと

pandasのmerge()やjoin()を使ってみましたが、重複生成されてしまう点は変わらなかったです。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

meg_

2020/06/15 22:20

希望の形を提示すると回答しやすくなるかもしれません。
gaww

2020/06/16 03:43

どうもありがとうございます。希望の形を示してみました。
meg_

2020/06/16 11:49

「df_test = pd.merge(grp_groupby.get_group(1),grp_groupby.get_group(2),on=0,how='outer') 」で、”しかし、結合merge()またはjoinを使って結合してみるとキーが丸ごと増えていってしまう。”の状態のデータフレームになりますか?(カラム0は重複なしなので質問の形にはならないかと思います)
meg_

2020/06/16 11:55

やりたいことはデータフレームのマージではなく、データフレームを横方向に結合することでしょうか?
gaww

2020/06/16 20:13

元データのリストgroup(1)(2)(3)は縦に繰り返された一連のデータです。 これを列1にあるキーワードで集計し、CSV形式で編集できるようにしたいものです。 方向は横でも縦でもよいです。
gaww

2020/06/16 20:29

pd.merge(grp_groupby.get_group(1),grp_groupby.get_group(2),on='label',how='outer')が正しいと思いますので修正しました。
guest

回答3

0

本来質問に対して追記・修正依頼をするところですが、テーブルをMarkdownで書きたいので回答欄に記述します。まず質問に関して最終的に行いたいことが伝わってきません。問題を簡素化して質問するのが良いでしょう。コツとしては

  • 生データではなく簡素化した項目にする
  • 最終的に得たい結果を具体的に示す
  • 見やすいようにMarkdownの表形式を用いる

のが良いと思います。

元のテーブル

01grp
VERSION3.01
EMAILabc@hogehoge.jp1
VERSION3.01
EMAILefg@hogehoge.jp1
VERSION3.02
EMAILabc@hogehoge.jp2
VERSION3.02
EMAILxyz@hogehoge.jp2

があったとして、最終的にどのようなテーブルを作成したいとお考えでしょうか?

投稿2020/06/15 22:46

yymmt

総合スコア1615

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

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

gaww

2020/06/16 03:43

アドバイスどうもありがとうございます。見やすくなりました。
yymmt

2020/06/16 03:57

ありがとうございます。とりあえず何が分かっていないかは理解できました。別途お答えします。
guest

0

自己解決

本件のようなデータ作成は行わないようにする

投稿2020/06/17 02:01

gaww

総合スコア0

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

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

0

テーブルの作り方ですが、ご質問のようなテーブルを作る事は殆どありません。リレーショナルデータベースの正規化を勉強するのが良いと思いますが、具体的に問題があるのは次の点です。

  • キーワード(NやEMAIL)を列に集める (行と列に分散するはNG、できれば列に集める)
  • 同じ列名を作らない

最終形態は以下のようなテーブルが良いのではと思います。

NEMAILgrp
登録太郎aaa@xxx.jp1
登録太郎bbb@xxx.jp1
登録次郎ccc@xxx.jp2
登録次郎ddd@xxx.jp2

提示されたgroup(1)からこのテーブルを作るのは大変なため、源泉となるデータから上記の形にするのが良いです。

投稿2020/06/16 04:28

yymmt

総合スコア1615

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

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

gaww

2020/06/16 21:08

アドバイスどうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問