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

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

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

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

pandas

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

Q&A

解決済

1回答

1118閲覧

Pythonにおいてデータ数が違うセットの結合

Danrussia

総合スコア44

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2019/04/13 04:18

編集2019/04/13 06:12

Pythonで"df1"のLabelと"df2"のPictureNumberで一致する場合に、df2の
SumpleとBeenNumberをdf1結合したいです。(写真下記)
df1とdf2でデータセットが違うので、うまく結合できませんでした。
イメージとして下記のようなものが作りたいです。
ご教授よろしくお願いいたします。

Label Sumple BeenNumber

img061c くるみ豆 B1

img061c くるみ豆 B1

img061c くるみ豆 B1

.... .... ....

Img070c 美味しい大豆 B10

import

1import matplotlib.pyplot as plt 2import pandas as pd 3import os 4df1=pd.read_csv('Native Been Analyze Side.csv') 5df2=pd.read_csv('imgNumber and BeenNumber.csv', encoding="shift-jis") 6df3=pd.merge(df1, df2, how="outer") 7df3.to_csv("Test.csv") 8```![df1のデータセットです。](b4cb28a773689eaff020e8c0f79fcc96.png) 9![df2のデータセットです。](c54275fddee28409f5fe70f5ce45077a.png)

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

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

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

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

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

guest

回答1

0

ベストアンサー

拡張子を取り払ったコラムを作りそれをキーとしてmergeしてはどうでしょうか。

python

1df1['PictureNumber'] = df1['Label'].apply(lambda s: s[:-4]) 2 3df3 = pd.merge(df1, df2, on='PictureNumber', how='left')

[追記]

python

1In [1]: import pandas as pd 2 3In [2]: df1 = pd.DataFrame({'Label':['img061c.jpg', 'img061c.jpg', 'img061c.jpg', 'img061c.jpg', 'img061c.jpg']}) 4 5In [3]: df2 = pd.DataFrame({'PictureNumber':['img061c.jpg', 'img062c.jpg', 'img063c.jpg'], 'SumpleNumber':['くるみ豆', '金持ち豆', '秘伝豆'], 'BeenNumber':['B2', 'B3', 'B4']}) 6 7In [4]: df1 8Out[4]: 9 Label 100 img061c.jpg 111 img061c.jpg 122 img061c.jpg 133 img061c.jpg 144 img061c.jpg 15 16In [5]: df2 17Out[5]: 18 PictureNumber SumpleNumber BeenNumber 190 img061c.jpg くるみ豆 B2 201 img062c.jpg 金持ち豆 B3 212 img063c.jpg 秘伝豆 B4 22 23In [6]: df3 = pd.merge(df1, df2, left_on='Label', right_on='PictureNumber', how='left').drop('PictureNumber', axis=1) 24 25In [7]: df3 26Out[7]: 27 Label SumpleNumber BeenNumber 280 img061c.jpg くるみ豆 B2 291 img061c.jpg くるみ豆 B2 302 img061c.jpg くるみ豆 B2 313 img061c.jpg くるみ豆 B2 324 img061c.jpg くるみ豆 B2 33

投稿2019/04/13 04:46

編集2019/04/13 06:39
nouken

総合スコア369

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

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

Danrussia

2019/04/13 05:12

df1['PictureNumber'] = df1['Label'].apply(lambda s: s[:-4]) df3 = pd.merge(df1, df2, on='PictureNumber', how='left') df3.to_csv("Test.csv") --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-9-6391332403e8> in <module>() ----> 1 df1['PictureNumber'] = df1['Label'].apply(lambda s: s[:-4]) 2 df3 = pd.merge(df1, df2, on='PictureNumber', how='left') 3 df3.to_csv("Test.csv") ~\Anaconda3\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds) 3192 else: 3193 values = self.astype(object).values -> 3194 mapped = lib.map_infer(values, f, convert=convert_dtype) 3195 3196 if len(mapped) and isinstance(mapped[0], Series): pandas/_libs/src\inference.pyx in pandas._libs.lib.map_infer() <ipython-input-9-6391332403e8> in <lambda>(s) ----> 1 df1['PictureNumber'] = df1['Label'].apply(lambda s: s[:-4]) 2 df3 = pd.merge(df1, df2, on='PictureNumber', how='left') 3 df3.to_csv("Test.csv") TypeError: 'float' object is not subscriptable というエラーコードが出ました。「拡張子を取り払ったコラムを作りそれをキーとしてmergeしてはどうでしょうか。」という意味が分からなかったのですが、もう少し詳しく教えていただけませんか?
Danrussia

2019/04/13 05:35

実際の完成イメージも追加しておきました。よろしくお願いいたします。
nouken

2019/04/13 05:50

文字列に対するスライスの処理でエラーが出てるようです。'Label'の列に欠損値が含まれていたりしませんか?float型のデータがあるようです。 データが違って結合できないということなので、df1の.jpgの部分を除いたコラムを作り、それを基準にdf2と結合したら良いのでは(データの形式が同じになっているので)、ということです。
Danrussia

2019/04/13 06:23

df2のPictureNumberにおいて、.jpgが抜けていたのはこちらのミスでした。すいません。 df1のLabelの対応表という形でdf2があり、df2の情報とdf1を結合したいというニュアンスです。 (df1にはimg060cを持つものが100個あるが、df2にはimg060cを持つものは1個しかなく、SumpleNumberとBeenNumberがある。df2の「SumpleNumber」と「BeenNumber」をdf1のimg060cを持つ列すべての隣に追加したい)
nouken

2019/04/13 06:37

こちらで簡単に同じようなデータセット作って、回答に追記しました。
Danrussia

2019/04/13 08:18

自分の望み通りの表が作れました。ありがとうございます。 次からもう少しわかりやすい説明を心がけます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問