同じ行要素を含む関数を適用してデータフレームの要素を更新

Update elements of dataframe by applying function involvinf same row elements – StackOverflow

まあ,普通にやればいいだけの話だが,

import io
import pandas as pd


strings = """a    b    c    d    e    f    g    h    i    j
1    2    3    4    5    6    7    8   0.1  0.11
11   12   13   14   15   16   17   18  0.2  0.12
21   22   23   24   25   26   27   28  0.3  0.13
31   32   33   34   35   36   37   38  0.4  0.14"""

df = pd.read_csv(io.StringIO(strings), sep='\s+')
df.assign(**df.filter(regex='[a-h]').sub(df['i'], 0).div(df['j'], 0))
a   b   c   d   e   f   g   h   i   j
0   8.181818    17.272727   26.363636   35.454545   44.545455   53.636364   62.727273   71.818182   0.1 0.11
1   90.000000   98.333333   106.666667  115.000000  123.333333  131.666667  140.000000  148.333333  0.2 0.12
2   159.230769  166.923077  174.615385  182.307692  190.000000  197.692308  205.384615  213.076923  0.3 0.13
3   218.571429  225.714286  232.857143  240.000000  247.142857  254.285714  261.428571  268.571429  0.4 0.14

メソッドチェーンで処理する事を考えると,pandas.DataFrame.evalを用いるのがリーズナブル.

from string import ascii_lowercase


formulas = '\n'.join(f'{c}=({c}-i)/j' for c in ascii_lowercase[:8])
df = (
    pd.read_csv(io.StringIO(strings), sep='\s+')
    .eval(formulas)
)
df
a   b   c   d   e   f   g   h   i   j
0   8.181818    17.272727   26.363636   35.454545   44.545455   53.636364   62.727273   71.818182   0.1 0.11
1   90.000000   98.333333   106.666667  115.000000  123.333333  131.666667  140.000000  148.333333  0.2 0.12
2   159.230769  166.923077  174.615385  182.307692  190.000000  197.692308  205.384615  213.076923  0.3 0.13
3   218.571429  225.714286  232.857143  240.000000  247.142857  254.285714  261.428571  268.571429  0.4 0.14

pandas.DataFrame.evalを用いて複数列の処理をしたい場合,改行で繋げる.分かり易く,ハードコードすると,

formulas = """a=(a-i)/j
b=(b-i)/j
c=(c-i)/j
d=(d-i)/j
e=(e-i)/j
f=(f-i)/j
g=(g-i)/j
h=(h-i)/j"""

pd.read_csv(io.StringIO(strings), sep='\s+').eval(formulas)
a   b   c   d   e   f   g   h   i   j
0   8.181818    17.272727   26.363636   35.454545   44.545455   53.636364   62.727273   71.818182   0.1 0.11
1   90.000000   98.333333   106.666667  115.000000  123.333333  131.666667  140.000000  148.333333  0.2 0.12
2   159.230769  166.923077  174.615385  182.307692  190.000000  197.692308  205.384615  213.076923  0.3 0.13
3   218.571429  225.714286  232.857143  240.000000  247.142857  254.285714  261.428571  268.571429  0.4 0.14
広告
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください