barilog

エンジニアリング見習い雑記

PandasのDataFrameの行を反復処理する方法は?

 

[Python] PandasのDataFrameの行を反復処理する方法は? rows | CODE Q&A [日本語]

 

こちらのサイトを参考にした.

1.行をSeriesとして取り出す方法

DataFrame.iterrows()を使う

for row in df.iterrows():
    print("c1 :",row["c1"],"c2 :",row["c2"])

 

2.行をタプルとして取り出す方法(iterrowsより高速)

DataFrame.itertuples()を使う

 

for row in df.itertuples():
    print("c1 :",row.c1,"c2 :",row.c2)

 

 

3.apply()メソッドに反復処理してもらう方法(一般にfor文使う場合よりも高速らしい)

DataFrame.apply()を使う

 

例1

def valuation_formula(x, y):
    return x * y * 0.5

df['price'] = df.apply(lambda row: valuation_formula(row['x'], row['y']), axis=1)

例2

def valuation_formula(x):
    return x ** 0.5

df = df.apply(valuation_formula, axis=1) #行全体に関数を適用

 

4.インデックスを指定する方法

for ind in df.index:
     print(df['c1'][ind], df['c2'][ind])

 

 

 

 

 

 

 

DataFrameに関数を適応したいとき

sinhrks.hatenablog.com

 

こちらを参照した.

基本的に各列,各行に関数を適応したいときは

DataFrame.apply

というようにDataFrameのメソッドのひとつであるapplyメソッドを使えば良い

 

・各列に対して関数を適応したいとき

DataFrame.apply(関数)

 

・各行に対して関数を適応したいとき

dataframe.apply(関数, axis=1)

 

 

 

map関数を使うのは賢明ではありません.

map(method, DataFrame)

で得られるものはデータフレームではなく,mapオブジェクトです.

 

a = map(sample_method, sample_df)

print(type(a))

# 結果 map

python処理を早くするために

1.単純なfor文の代わりにmapまたはリスト内包表記で代用しよう

2.SQLクエリを何度も実行するのはやめよう

3.オブジェクトへの参照回数はなるべく減らそう

4.データフレームの読み書きにはcsvではなくpickleを使おう

 

まず1について.

utgwkk.hateblo.jp

 

これによると関数を呼び出す際はひとまずmapをつかっとくのが無難っぽい.

 

次に4について

yutori-datascience.hatenablog.com

 

これによるとこれはcsvの読み込みの早さはdask ≒ pickle >>read_csv

daskは使っと事ないからわからんので私のような雑魚はpickleをつかおう.

ただし,pickleだとメモリに全部一気に展開がされてしまうので,大きなデータサイズのcsvを読む場合だと他の処理如何でメモリリークが起こりそう.一行ずつ処理したり,並列で処理できるようにするのが理想だよね.. 

 

arXiv ACL2018に参加した

最初の論文

Probabilistic FastText for Multi-Sense Word Embeddings

 

pffmswe.png

Sentence-State LSTM for Text Representation

 

センテンスのベクトル表現を獲得する手法

Takanori Nakai, Data scientist at D2c | SlideShare

のスライドが参考になる

 

知識ベースの情報を組み込んだ