

以下のようなデータフレーム

[code]

    a1,a2,a3,b1
    1,1,2,4
    3,4,2,1
    3,6,2,9
    ...
    
    
[/code]

を考えます。  
c1=a1/b1,c2=a2/b1,c3=a3/b1をそれぞれ計算してデータフレームの右につけようと考えています。  
この場合は3変数なのでまだ手で書けますが、（Rの場合は`mutate(c1=a1/b1,c2=a2/b1,c3=a3/b1)`でしょうか。)より変数が増えたときに対応できる方法をPython(pandas),
R(dplyr)の両方で知りたいです。  
よろしくお願いいたします。


CC BY-SA 4.0
2019-02-17T16:34:07.890
52834
2019-02-18T00:58:50.467
12457
question
python r pandas dplyr
データフレームの複数列を一つの列で割る


pandasならこうでしょうか。

[code]

    df1 = pd.DataFrame([[1,1,2,4],
                        [3,4,2,1],
                        [3,6,2,9]],
                      columns=["a1","a2","a3","b1"])
    
    df2 = df1.div(df1["b1"], axis=0).drop("b1", axis=1) # 各列をb1で割る
    df2.columns = df2.columns.map(lambda s: s.replace("a", "c"))
    
    df3 = pd.concat([df1, df2], axis=1) # 右に連結
    
[/code]

Rで同様にやるならこうでしょうか。

[code]

    df1 <- data.frame(a1=c(1,3,3), a2=c(1,4,6), a3=c(2,2,2), b1=c(4,1,9))
    
    df2 <- df1 / df1$b1
    df2$b1 <- NULL
    df2 <- rename_all(df2, function (x) sub("a", "c", x))
    
    df3 <- cbind(df1, df2)
    
[/code]


CC BY-SA 4.0
2019-02-17T17:27:37.500
52835
2019-02-17T18:46:20.473
2019-02-17T18:46:20.473
9464
9464
52834
answer


とりあえず書いてみました。  
こんな感じでどうでしょうか。

**Python版**

[code]

    import pandas as pd
    df = pd.DataFrame({'a1':[1,3,3],'a2':[1,4,6],'a3':[2,2,2],'b1':[4,1,9]})
    
    df.join(df.loc[:, :'a3'].div(df['b1'], axis=0).add_prefix('d_'))
    #   a1  a2  a3  b1      d_a1      d_a2      d_a3
    #0   1   1   2   4  0.250000  0.250000  0.500000
    #1   3   4   2   1  3.000000  4.000000  2.000000
    #2   3   6   2   9  0.333333  0.666667  0.222222
    
[/code]

**R(dplyr)版**

[code]

    library(dplyr)
    df <- data.frame(a1=c(1,3,3), a2=c(1,4,6), a3=c(2,2,2), b1=c(4,1,9))
    
    df %>% mutate(d=df[1:ncol(df)-1] / df$b1)
    #  a1 a2 a3 b1      d.a1      d.a2      d.a3
    #1  1  1  2  4 0.2500000 0.2500000 0.5000000
    #2  3  4  2  1 3.0000000 4.0000000 2.0000000
    #3  3  6  2  9 0.3333333 0.6666667 0.2222222
    
[/code]


CC BY-SA 4.0
2019-02-18T00:58:50.467
52838
2019-02-18T00:58:50.467
24801
52834
answer