

独学でPython、Rを学んでいます。

[code]

            a       b       c       d       e       f       ...     x
    ID_1    11      17      32      9       62      299     
    ID_2    3       71      22      929     11      39      
    ID_3    43      21      2       41      42      8       
    ID_4    9       1       99      78      2       1
    .
    .
    .
    ID_X    
    
[/code]

上記のようなテーブルから、  
a列が10以上の場合（ID_1, ID_3）のみa列×b列を計算、c列が10以上の場合（ID_1, ID_2,
ID_4）のみc列×d列を計算、といった処理をしたいのですが、  
うまい処理の方法がわかりません。  
100行以上ある行、列で、自動で2列ずつ分割して判定、処理する方法はありませんでしょうか？よろしくお願いします。

追記  
書き方がわかりにくくて申し訳ありません。  
f列以降の列も、ID_4以降の行も続く大きなテーブルでの処理です。  
なので、a列の判定->計算、c列の判定->計算・・・といった個別の処理が出来なく、  
うまい処理方法をご教示いただきたいです。

追記2

[code]

            a/b      c/d      e/f    ...     x
    ID_1    0.6      3.6      0.2      
    ID_2    NA       0.0      0.3       
    ID_3    2.0      NA       5.3      
    ID_4    NA       1.3      NA 
    .
    .
    .
    ID_X    
    
[/code]

イメージとしては、上記のようなアウトプットを想定しています。

現在、

> > odd <\- DF[(0:(ncol(DF)%/%2)*2)+1]  
>  > even <\- DF[(0:(ncol(DF)%/%2)*2)]  
>  > odd / even

とすることで、なんとか隣り合った列を計算させることはできましたが、  
各偶数列が10以上の行のみ計算する方法がまだわかりません。


CC BY-SA 3.0
2017-05-01T02:27:08.673
34396
2018-04-15T02:59:05.733
2017-05-02T07:04:18.107
22885
22885
question
python r
pythonもしくはRで2行ずつの処理をする方法


Pythonでの例です。

前処理

[code]

    PS C:\> python.exe
    Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul  5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> text = '''        a       b       c       d       e       f
    ... ID_1    11      17      32      9       62      299
    ... ID_2    3       71      22      929     11      39
    ... ID_3    43      21      2       41      42      8
    ... ID_4    9       1       99      78      2       1'''
    >>> data = [x.split() for x in text.splitlines()]
    >>> data
    [['a', 'b', 'c', 'd', 'e', 'f'], ['ID_1', '11', '17', '32', '9', '62', '299'], ['ID_2', '3', '71', '22', '929', '11', '39'], ['ID_3', '43', '21', '2', '41', '42', '8'], ['ID_4', '9', '1', '99', '78', '2', '1']]
    >>> header = data.pop(0)
    >>> header
    ['a', 'b', 'c', 'd', 'e', 'f']
    >>> data
    [['ID_1', '11', '17', '32', '9', '62', '299'], ['ID_2', '3', '71', '22', '929', '11', '39'], ['ID_3', '43', '21', '2', '41', '42', '8'], ['ID_4', '9', '1', '99', '78', '2', '1']]
    >>> header = ['index'] + header
    >>> import pandas as pd
    >>> df = pd.DataFrame(data,  columns=header, dtype=int)
    >>> df = df.set_index(['index'])
    >>> df
            a   b   c    d   e    f
    index
    ID_1   11  17  32    9  62  299
    ID_2    3  71  22  929  11   39
    ID_3   43  21   2   41  42    8
    ID_4    9   1  99   78   2    1
    
[/code]

aが10以上の行

[code]

    >>> df[df.a>=10]
            a   b   c   d   e    f
    index
    ID_1   11  17  32   9  62  299
    ID_3   43  21   2  41  42    8
    
[/code]

aが10以上の行は、aとbを掛ける

[code]

    >>> df[df.a>=10].apply(lambda s: s.a * s.b, axis=1)
    index
    ID_1    187
    ID_3    903
    dtype: int64
    
[/code]

cが10以上の行は、cとdを掛ける

[code]

    >>> df[df.c>=10].apply(lambda s: s.c * s.d, axis=1)
    index
    ID_1      288
    ID_2    20438
    ID_4     7722
    dtype: int64
    
[/code]


CC BY-SA 3.0
2017-05-01T03:02:26.923
34397
2017-05-01T03:02:26.923
806
34396
answer


欲しいアウトプットよく分かりませんが、Rで一つのやり方あげます：

[code]

    #奇数列の索引
    odd_col = seq(1L, ncol(DF), by = 2L)
    lapply(odd_col, function(jj) {
      #適当な行を選ぶ
      idx = DF[[jj]] >= 10
      #これと隣の列をかける
      DF[[jj]][idx] * DF[[jj+1L]][idx]
      })
    
[/code]


CC BY-SA 3.0
2017-05-01T19:30:45.850
34408
2017-05-01T19:30:45.850
18598
34396
answer


Pandasの場合は、[::2]で2個飛ばしにできるので、次のように計算できます。

[code]

    import pandas as pd
    import numpy as np
    
    # サンプルデータ
    df = pd.DataFrame([[11, 17, 32, 9, 62, 299],
                 [3, 71, 22, 929, 11, 39],
                 [43, 21, 2, 41, 42, 8],
                 [9, 1, 99, 78, 2, 1]],
                 columns = ['a', 'b', 'c', 'd', 'e', 'f'])
    
    # a, c, e,...列をとる
    df1 = df.iloc[:,::2]
    # b, d, f,...列をとる
    df2 = df.iloc[:,1::2]
    # 10以上の場合に計算する。ここでは割り算をしています
    df1[df1 >= 10] / np.array(df2)
    
[/code]


CC BY-SA 3.0
2018-04-15T02:29:58.930
43251
2018-04-15T02:59:05.733
2018-04-15T02:59:05.733
15171
15171
34396
answer