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

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

ただいまの
回答率

90.50%

  • Python

    8023questions

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

  • pandas

    586questions

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

  • リストボックス

    13questions

    ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

pandasの2つのdataframeの要素同士の一部が一致する列の抽出

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 791

trafalbad

score 187

pandasで元のリスト(cate_list)から1列目のカテゴリ内で3列目が最も大きい行を抽出し,新しいdataframe(cate_after)を作りました。形式はcsvから読み込んだdataframeです。

例cate_list
[列]name_kana, cate,count
[' アップルパーク', 'ブロック・パズル・ゲーム', '1'],
 [' アップルパーク', 'ガラガラ・ラトル', '7'],
 [' アップルパーク', '子供用パジャマ・ルームウェア・スリーパー', '3'],
 [' アップルパーク', 'ファッション雑貨・小物その他', '1'],
 [' アップルパーク', 'おもちゃ・知育玩具その他', '12'],
 [' アップルパーク', 'おもちゃ・知育グッズ', '30'],

これは本来1列(nama_kana)のカテゴリが複数ある中で、3列め(count)中で数が最も多いもののdataframe(cate_after)に変換したものです。

コード

cate_after
[' アップルパーク', '30'],
 [' シースリーフィット', '2'],
 ['100パーセントピュア', '38'],
 ['10クロスビーデレクラム', '34'],
 ['1789カーラ', '18'],
 ['23イヤーズオールド', '7'],
 ['24カラッツ・サーフ', '386'],
,,,,,,,
変換コード
od = OrderedDict()
for index,i in cate_list.iterrows():
    od.setdefault(i['name_kana'],[]).append(i['count'])

cate=[]
for key,value in od.items():
    cate.append([key,max(value)])

ここでdataframeのcate_afterに元のdataframeの2列目の'cate'を追加したいのですが、うまく行きません。

つまりcate_afterの1列目と3列目に一致するcate_listの2列目の'cate'を加えたdataframeを作りたいということです。

dataframeに以下のコードでもうまく行きません。

arr=[]
for index, v in cate_list.iterrows():
    for d,c in cate_after.iterrows():
        if v{'name_kana'}==c['name_kana'] and v['count']==c['count']:
             arr.append(v['name_kana'],v['cate'],v['count'])

このようなあるdataframeともう一つのdataframeの要素の一部が共通している列を抜き出す方法を教えてください

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

それなら最初から3列のdfにした方が手っ取り早いのでは? って気が。pandas使うコードは個人的にあまり上手く書けないのですが、だいたいこんな感じで。

  • sample_data.csv
hoge,h,1
hoge,o,2
hoge,g,4
hoge,e,8
fuga,fu,16
fuga,fg,32
fuga,fa,64
fuga,ug,128
fuga,ua,256
fuga,ga,512
piyo,piy,1024
piyo,pio,2048
piyo,pyo,4096
piyo,iyo,8192
import pandas as pd

df = pd.read_csv("sample_data.csv", header=None)
print("initial df")
print(df)

first_index = set(df[0])

slist = []
for first in first_index:
    group = df[df[0] == first]
    slist.append(group.loc[group[2].idxmax()])

result_df = pd.DataFrame(slist).reset_index(drop=True)

print("\nresult df")
print(result_df)
"""出力
initial df
       0    1     2
0   hoge    h     1
1   hoge    o     2
2   hoge    g     4
3   hoge    e     8
4   fuga   fu    16
5   fuga   fg    32
6   fuga   fa    64
7   fuga   ug   128
8   fuga   ua   256
9   fuga   ga   512
10  piyo  piy  1024
11  piyo  pio  2048
12  piyo  pyo  4096
13  piyo  iyo  8192

result df
      0    1     2
0  fuga   ga   512
1  hoge    e     8
2  piyo  iyo  8192
"""

あとは2列にしたければ差っ引くなり、どうにでも料理できるでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/13 23:53

    できました、ありがとうございます!
    setだと順番が崩れてしまうので
    http://publicjournal.hatenablog.com/entry/2017/10/08/113544
    ここも参考にしました

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    8023questions

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

  • pandas

    586questions

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

  • リストボックス

    13questions

    ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。