3

私の目標は、各行の異なる列から要素を選択して、Pandas DataFrame から Series を作成することです。

たとえば、次の DataFrame があります。

In [171]: pred[:10]
Out[171]: 
                     0  1  2
Timestamp                   
2010-12-21 00:00:00  0  0  1
2010-12-20 00:00:00  1  1  1
2010-12-17 00:00:00  1  1  1
2010-12-16 00:00:00  0  0  1
2010-12-15 00:00:00  1  1  1
2010-12-14 00:00:00  1  1  1
2010-12-13 00:00:00  0  0  1
2010-12-10 00:00:00  1  1  1
2010-12-09 00:00:00  1  1  1
2010-12-08 00:00:00  0  0  1

そして、私は次のシリーズを持っています:

In [172]: useProb[:10]
Out[172]: 
Timestamp
2010-12-21 00:00:00    1
2010-12-20 00:00:00    2
2010-12-17 00:00:00    1
2010-12-16 00:00:00    2
2010-12-15 00:00:00    2
2010-12-14 00:00:00    2
2010-12-13 00:00:00    0
2010-12-10 00:00:00    2
2010-12-09 00:00:00    2
2010-12-08 00:00:00    0

useProb の列情報に基づいて pred から値を取得し、次を返す新しいシリーズ usePred を作成したいと思います。

In [172]: usePred[:10]
Out[172]: 
Timestamp
2010-12-21 00:00:00    0
2010-12-20 00:00:00    1
2010-12-17 00:00:00    1
2010-12-16 00:00:00    1
2010-12-15 00:00:00    1
2010-12-14 00:00:00    1
2010-12-13 00:00:00    0
2010-12-10 00:00:00    1
2010-12-09 00:00:00    1
2010-12-08 00:00:00    0

この最後のステップで失敗します。私は次のようなことを試しました:

usePred = pd.DataFrame(index = pred.index)
for row in usePred:
    usePred['PREDS'].ix[row] = pred.ix[row, useProb[row]]

そして、私は試しました:

usePred['PREDS'] = pred.iloc[:,useProb]

何時間もスタックオーバーフローをグーグルで検索しましたが、問題を解決できないようです。

4

2 に答える 2

3

DataFrame.lookupを使用してそれを行う別の方法を次に示します。

pred.lookup(row_labels=pred.index, 
            col_labels=pred.columns[useProb['0']])

ラベルである値を提供するために注意を払う必要があることを除いて、それはまさにあなたが必要としているもののようです。たとえば、pred.columns文字列でuseProb['0']値が整数の場合、次を使用できます

pred.columns[useProb['0']]

パラメータに渡される値col_labelsが適切なラベル値になるようにします。


例えば、

import io
import pandas as pd
content = io.BytesIO('''\
Timestamp  0  1  2
2010-12-21 00:00:00  0  0  1
2010-12-20 00:00:00  1  1  1
2010-12-17 00:00:00  1  1  1
2010-12-16 00:00:00  0  0  1
2010-12-15 00:00:00  1  1  1
2010-12-14 00:00:00  1  1  1
2010-12-13 00:00:00  0  0  1
2010-12-10 00:00:00  1  1  1
2010-12-09 00:00:00  1  1  1
2010-12-08 00:00:00  0  0  1''')
pred = pd.read_table(content, sep='\s{2,}', parse_dates=True, index_col=[0])

content = io.BytesIO('''\
Timestamp  0
2010-12-21 00:00:00    1
2010-12-20 00:00:00    2
2010-12-17 00:00:00    1
2010-12-16 00:00:00    2
2010-12-15 00:00:00    2
2010-12-14 00:00:00    2
2010-12-13 00:00:00    0
2010-12-10 00:00:00    2
2010-12-09 00:00:00    2
2010-12-08 00:00:00    0''')
useProb = pd.read_table(content, sep='\s{2,}', parse_dates=True, index_col=[0])
print(pd.Series(pred.lookup(row_labels=pred.index, 
                col_labels=pred.columns[useProb['0']]),
                index=pred.index))

収量

    Timestamp
2010-12-21    0
2010-12-20    1
2010-12-17    1
2010-12-16    1
2010-12-15    1
2010-12-14    1
2010-12-13    0
2010-12-10    1
2010-12-09    1
2010-12-08    0
dtype: int64
于 2013-09-03T12:52:02.107 に答える