あれもPython,これもPython

Pythonメモ※本サイトはアフィリエイトを利用しています

記事来訪データなんかを、テキストマイニングをかける時の前処理

大量の要素が発生する場合、テキストマイニングで使う処理やネットワーク分析的な形におとしたいのですが、
その辺の定型インプットに持っていく前に、結構ケースバイケースの処理をかけなくては行けないことがあります。

Python的には基本中の基本の関数が多いですが、
時々忘れるので、やりたいこととセットで整理しておきます。

別々の行に突っ込んだものを、セパレータつきでまとめる

ユーザーid✖️記事来訪みたいなデータをユーザーid✖️記事idのリストにしたいとき。

#data = [['user1','article1']....]みたいなデータ

from collections import defaultdict

dat = defaultdict(list)
for k,v in data:
    dat[k].append(v)

res = []
for k,v in data.items():
    res.append([k,','.join(v)]

まあ、sql側でstring_aggした方が楽なことが多いですが、、、

文字列を分離してリストにしたりする

#data = ['article1,article2....']みたいなデータ

datas = data.split(',')

#くっつけるのは上でも使ってるがjoin
','.join(datas)

,でつながってるデータをよこもちにしたい

string_aggとかしちゃったけど、よく考えると横持ちして置きたかったとき

一回縦持ちにして、pivotしてもいいですが、
Counterを使う手もあります

from collections import Counter

# data = ['article1,article2','article1,article3'...]みたいなデータ
buf = []
for row in data:
    cntr = Counter()
    for article in row.split(','):
         cntr[article] += 1

    buf.append(cntr)

df = pd.DataFrame(buf)

重複をなくしつつ、listにはしておきたい

setを一回経由すると楽です

list(set(data))

ngram的なデータにしたい

nltkなどをかました方が楽かもしれない

#ユーザーと来訪記事データ
df = pd.DataFrame([['user1','a'],['user1','b'],['user2','a']])
df.columns = ['usr','visit']

#ユーザーごとに集約しつつ、transformすることでまとめないでshiftでずらす
df['next_visit'] = df.groupby('usr').visit.transform('shift',-1)