🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

pandas

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

Q&A

解決済

1回答

473閲覧

一か所だけmergeがうまくいかない

Pablito

総合スコア71

Python 3.x

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

pandas

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

0グッド

1クリップ

投稿2019/12/02 05:41

前提・実現したいこと

データフレームの中に、
「福岡|福岡」となっているようなカラムが3つあり、
一度.str.split('|')で区切った後、
1列目だけを抜き出し、
再度元のデータフレームに結合することで
前処理をしようとしています。

すると2つ目のカラムと元のデータフレームを
結合しようとしたとき、
データがありえないくらい大きくなってしまいました。

元のデータフレームは
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8557 entries, 0 to 8556
Data columns (total 57 columns):
A 8557 non-null object
B 8557 non-null object
C 1241 non-null float64
D 1241 non-null object
E 1241 non-null object
F 1241 non-null object
G 1093 non-null object
H 1225 non-null object
I 4362 non-null object
J 4362 non-null float64
K 4362 non-null float64

みたいな感じです。

該当のソースコード

Python

1import pandas as pd 2import numpy as np 3import datetime as dt 4import codecs 5 6with codecs.open("G:\属性_11月分.csv", 7 "r", "Shift-JIS", "ignore") as file: 8 df = pd.read_table(file, delimiter=",", dtype={'ユーザー名': object}) 9df.head() 10 11df.dropna(subset=['ホテル名'], inplace=True) 12 13date_birth = df['生年月日'].str.split('|', expand=True) 14a = date_birth[[0]] 15a.rename(columns= {0: '生年月日'}, inplace=True) 16 17#mergeしたらデータの個数が大きくなるところ 18name = df['ホテル名'].str.split('|', expand=True) 19b = name[[0]] 20b.rename(columns={0: 'ホテル名'}, inplace=True) 21 22''' 23<class 'pandas.core.frame.DataFrame'> 24Int64Index: 1241 entries, 3 to 8555 25Data columns (total 1 columns): 26ホテル名 1241 non-null object 27dtypes: object(1) 28memory usage: 14.5+ KB 29''' 30 31live = df['居住地'].str.split('|', expand=True) 32c = live[[0]] 33c.rename(columns={0: '居住地'}, inplace=True) 34 35data = pd.merge(df, a, on='生年月日', how='left') 36data.info() 37 38''' 39<class 'pandas.core.frame.DataFrame'> 40Int64Index: 1950 entries, 0 to 1949 41Data columns (total 17 columns): 42A 1950 non-null object 43B 1950 non-null object 44C 1950 non-null float64 45ホテル名 1950 non-null object 46D 1950 non-null object 47E 1950 non-null object 48居住地 1522 non-null object 49生年月日 1694 non-null object 50F 581 non-null object 51G 581 non-null float64 52H 581 non-null float64 53I 1950 non-null object 54J 581 non-null object 55K 431 non-null object 56L 411 non-null object 57M 581 non-null object 58N 581 non-null object 59#問題なし 60''' 61#データの個数がなぜか何倍にもなる 62VV = pd.merge(data, b, on='ホテル名', how='left') 63 64VV.info() 65 66''' 67<class 'pandas.core.frame.DataFrame'> 68Int64Index: 642509 entries, 0 to 642508 69Data columns (total 17 columns): 70A 642509 non-null object 71B 642509 non-null object 72C 642509 non-null float64 73ホテル名 642509 non-null object 74D 642509 non-null object 75E 642509 non-null object 76居住地 574292 non-null object 77生年月日 640989 non-null object 78F 200390 non-null object 79G 200390 non-null float64 80H 200390 non-null float64 81I 642509 non-null object 82J 200390 non-null object 83K 146738 non-null object 84L 139382 non-null object 85M 200390 non-null object 86N 200390 non-null object 87dtypes: float64(3), object(14) 88memory usage: 53.9+ MB 89なぜかデータが大きくなった 90'''

試したこと

pd.merge_asofやhow='inner'などを試しましたが、
解決には至りませんでした。。。

何卒宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

キーの値に重複があると行が増えます。

たとえば
a = [福岡, 福岡]b = [福岡, 福岡]をキーにして結合すると、
a[0]*b[0], a[0]*b[1], a[1]*b[0], a[1]*b[1]の組み合わせが考えられるので[福岡, 福岡, 福岡, 福岡]が返ってきます。

実行したいことは以下で代用できるかと思いますが、いかがでしょうか。

python

1df['ホテル名'] = df['ホテル名'].str.split('|').str.get(1)

投稿2019/12/03 02:08

kirara0048

総合スコア1399

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

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

Pablito

2019/12/03 04:47

kirara0048様 ご回答ありがとうございます! 本件は別の方法で解決しましたが、 ご教示頂いた内容も今後の参考にさせて頂きます! 引き続きよろしくお願い致します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問