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

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

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

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

Q&A

解決済

1回答

1012閲覧

python の DataFrame から特定行を抽出できない。

km0815.lj

総合スコア14

Python

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

0グッド

0クリップ

投稿2021/12/02 10:11

やりたいこと
表1の様なDataFrame から 表2のkey列とd列の値を持つ行を抽出したい。

表0(df0)

keymei
01AAAA
FFFFFF

表1(df1)

keybc
01100A1
02200A2
03300A3
04400A4
05500A5
FFFFFFF

表2(df2)
|key|d|e|
|:--|:--|
|01|02,04|100|
|FF|05|200|

python

1import pandas as pd 2from io import StringIO 3import itertools 4 5s = """key,mei 601,AAA 7FF,FFF 8""" 9df0 = pd.read_csv(StringIO(s)) 10 11s = """key,b,c 1201,100,A1 1302,200,A2 1403,300,A3 1504,400,A4 1605,500,A5 17FF,FFF,FF""" 18df1 = pd.read_csv(StringIO(s)) 19 20s = """key,d,e 2101,"02,04",100 22FF,"05",200 23""" 24df2 = pd.read_csv(StringIO(s)) 25 26for data1 in zip(df0['key']): 27 df2_2 = df2.loc[(df2['key'] == data1[0]),['d']] 28 df1_2 = df1.query('key == @data1[0] or key in @df2_2') 29# 30# 表1のkey値毎の処理 31# 32

key値が01のとき以下の様な結果になりません。

結果

keybc
01100A1
02200A2
04400A4

どの様な記述をすれば良いでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1df_list = df2.apply(lambda x: df1[df1.key.isin([x.key]+x.d.split(','))], axis=1) 2 3for i in range(len(df2)): 4 print(f'key = {df2.key[i]}') 5 print(df_list[i]) 6 7# 8key = 01 9 key b c 100 01 100 A1 111 02 200 A2 123 04 400 A4 13 14key = FF 15 key b c 164 05 500 A5 175 FF FFF FF

投稿2021/12/02 11:18

編集2021/12/02 11:34
melian

総合スコア20655

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

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

km0815.lj

2021/12/02 11:29

ご回答ありがとうございます。 明日実際のプログラムで確認致します。
km0815.lj

2021/12/03 02:15

ここに記載したサンプルは動きましたが、実際のプログラムに適用すると ----> 1 df_list = df2.apply(lambda x: df1[df1.key.isin([x.key]+x.d.split(','))], axis=1) 'float' object has no attribute 'split' というエラーになりました。 d列は Name: d, Length: 14307, dtype: object です。 実際のデータでは、d列にNaNとなるデータが含まれているためと思います。 s = """key,d,e 01,"02,04",100 07,,700 FF,"05",200 """ NaNをブランクに変換することで、エラーは出なくなりました。 (サンプルが悪く申し訳ございません) 結果が、データフレームでないので、データフレームに変換し 後続処理で使えるようにします。 ありがとうございました。
melian

2021/12/03 02:39

どうもありがとうございます。こちらこそ NaN が含まれている場合を想定しておくべきでした。
km0815.lj

2021/12/03 07:42

ご教授頂いた内容を元に、いろいろと試しなんとか想定通りにプログラムができました。 誠にありがとうございます。 ただ、1つどうしても不明な点があり、ご存知であればご教授願います。 データは以下3つのdf df_misyuu:未収のデータ  df_houjin:取引先マスタデータ(df_houjin と df_houjin_addと法人コードでマージして作成)  df_houjin_add:取引先マスタの追加情報 ※split文字は[,]ではなく[:]に変えています。 ----------------------------------------------------------------------------------------------------------- <OKになるプログラム> df1 = df_misyuu df2 = df_houjin_add df1_2 = df1[df1['法人コード']=='0049917'] df2_2 = df2[df2['法人コード']=='0049917'] df_list = df2_2.apply(lambda x: df1[df1.法人コード.isin(x.読替表法人コード.split(':'))], axis=1) df1_2 = df1_2.append(pd.DataFrame(df_list[0])) <NGになるプログラム>※df2に代入しているdf以外同じです。 df1 = df_misyuu df2 = df_houjin df1_2 = df1[df1['法人コード']=='0049917'] df2_2 = df2[df2['法人コード']=='0049917'] df_list = df2_2.apply(lambda x: df1[df1.法人コード.isin(x.読替表法人コード.split(':'))], axis=1) df1_2 = df1_2.append(pd.DataFrame(df_list[0])) ----------------------------------------------------------------------------------------------------------- df2にdf_houjin_add を使用した場合、想定したデータが抽出されOKでしたが、 df_houjin を使用した場合、想定したデータが出力されません。(0件) df2_2['読替表法人コード']で値を確認すると OKの場合 0 0049918:0049919 Name: 読替表法人コード, dtype: object NGの場合 9689 0049918:0049919 Name: 読替表法人コード, dtype: object 内容は同じですが、NGの場合右寄せになっているように見えますが indexとの空白桁が同じなので、関係はないかと思いますが、 これが原因なのでしょうか。 また、これが原因だとすれば、どの様にすれば良いでしょうか。 原因がこれでなければ、なぜマージしたデータの項目を使用する場合と 違いがでるのでしょうか。 実際のデータがないとご回答できないかと存じますが、 もし何かご存知であれば、ご教授願います。
km0815.lj

2021/12/03 08:05

追伸 df_houjin_addにデータを数件加えると NGになったことから df2_2.reset_index(inplace=True,drop=True) indexを張りなおすとOKになりました。 なぜindexが関係するのか良くわかりません。 df2_2.apply(lambda x ~ という記述が、初心者にはちょっと難解で、今一理解していないためのミスなのかも知れません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問