さて、前回の続きになりますが、共同出願人の処理からでしたね。
これのやりかたが習得できれば、同じく1セルに複数の情報を含む特許分類や自分で付与した独自分類なんかの集計処理も同様に行うことができます。
前回までのJupyterの画面の続きから操作していきます。まずは、データフレームdf1の出願人データを区切り文字である’;’で切り分けてapnsに保管していきます。
apns = df1['出願人'].map(lambda x: x.split(';'))
次に作ったapnsをシリーズ形式のデータに変換します。
ser1 = pd.Series(np.hstack(apns.values))
出来上がったシリーズ形式の出願人名から重複を除去したシリーズデータに変換します。
unique_apns = ser1.str.strip().unique() unique_apns.sort()
一つの出願人について1行のデータリストを作成するための関数を定義します。
def filter_df_by_apn(df, apn):
apn_df = df.loc[df['出願人'].map(lambda x: apn in x)].copy()
apn_df['出願人'] = apn
return apn_df
上記関数を用いて、先の処理で重複を取り除いた出願人のリスト中の出願人ごとに対象の出願の行を抜き出してリストに追加します。
apn_df_list =[filter_df_by_apn(df1, apn) for apn in unique_apns]
あとは、できたリストを新たなデータフレームdf2に格納するだけです。データフレームをシンプル化するために公報番号と
df2 = pd.concat(apn_df_list) df2 = df2.loc[:,['公報番号','出願人','出願日']] df2.sort_values('公報番号', inplace=True) df2.head()
こんな感じのデータフレームになります。
あとは前回と同様に集計してみるだけですね。
df2['公報番号'].groupby([df2['出願人'], df2['出願日'].dt.year]).count()
こんな感じになります。名寄せは出来ていないのでローベルトボッシュ等の項目に違和感はありますが、これの処理についてはまた次回にでも。特許分類であれば名寄せはいらないと思いますので、今回の出願人で用いた手法を使いまわすことができます。そして作った出願人の切り分けデータフレームと特許分類の切り分けデータフレームを合体させて集計を行うと、おなじみの出願人ー分類別件数集計表や出願人ー分類バブルマップ等につながるわけですが、こちらも次回以降で。
【参考書籍】