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