1

TLDR:列またはその値を明示的に指定せずに、パンダデータフレーム内の複数の列のすべてのオプションを反復する方法は?

長いバージョン:私はこのような pandas データフレームを持っていますが、ここにリストされているよりも多くの機能または薬物投与量の組み合わせしかありません。3 種類の機能だけでなく、70 のようなものを使用することもできます...:

> dosage_df

First Score Last Score  A_dose  B_dose  C_dose
22          28          1       40      130
55          11          2       40      130
15          72          3       40      130
42          67          1       90      130
90          74          2       90      130
87          89          3       90      130
14          43          1       40      700
12          61          2       40      700
41          5           3       40      700

データ フレームに加えて、各機能に関連する範囲を含む Python 辞書もあります。キーは機能名であり、取り得るさまざまな値がキーです。

> dict_of_dose_ranges = {'A_dose': [1, 2, 3], 'B_dose': [40, 90], 'C_dose': [130,700]}

私の目的のために、特定の組み合わせ (A_dose = 1、B_dose = 90、および C_dose = 700 など) を生成する必要があり、これらの設定に基づいて、データフレームから関連するスライスを取り出し、その小さなサブセットから関連する計算を行います。結果をどこかに保存します。

すべての機能のすべての可能な組み合わせに対してこれを行う必要があります (ここにある 3 つよりもはるかに多く、将来的には可変になります)。

この場合、これを SkLearn のパラメーター グリッドに簡単にポップして、オプションを生成できます。

> from sklearn.grid_search import ParameterGrid
> all_options = list(ParameterGrid(dict_of_dose_ranges)) 
> all_options

そして得る:

[{'A_dose': 1, 'B_dose': 40, 'C_dose': 130},
 {'A_dose': 1, 'B_dose': 40, 'C_dose': 700},
 {'A_dose': 1, 'B_dose': 90, 'C_dose': 130},
 {'A_dose': 1, 'B_dose': 90, 'C_dose': 700},
 {'A_dose': 2, 'B_dose': 40, 'C_dose': 130},
 {'A_dose': 2, 'B_dose': 40, 'C_dose': 700},
 {'A_dose': 2, 'B_dose': 90, 'C_dose': 130},
 {'A_dose': 2, 'B_dose': 90, 'C_dose': 700},
 {'A_dose': 3, 'B_dose': 40, 'C_dose': 130},
 {'A_dose': 3, 'B_dose': 40, 'C_dose': 700},
 {'A_dose': 3, 'B_dose': 90, 'C_dose': 130},
 {'A_dose': 3, 'B_dose': 90, 'C_dose': 700}]

これは私が問題に遭遇する場所です:

問題 #1)を繰り返し処理できるall_optionsようになりましたが、各辞書オプションから SELECT を実行する方法がわかりませんdosage_df(つまり、{'A_dose': 1, 'B_dose': 40, 'C_dose': 130} ) 明示的に実行せずに。

以前は、次のようなことができました。

dosage_df[(dosage_df.A_dose == 1) & (dosage_df.B_dose == 40) & (dosage_df.C_dose == 130)]

First Score Last Score  A_dose  B_dose  C_dose
0           22          28      140     130

しかし、動的にスライスするために括弧内に何を入れればよいかわかりません...

dosage_df[?????]

問題 #2)実際に機能の完全な辞書にそれぞれの範囲を入力すると、オプションが多すぎると見なされるため、エラーが発生します...

from sklearn.grid_search import ParameterGrid
all_options = list(ParameterGrid(dictionary_of_features_and_ranges)) 
all_options

---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
<ipython-input-138-7b73d5e248f5> in <module>()
      1 from sklearn.grid_search import ParameterGrid
----> 2 all_options = list(ParameterGrid(dictionary_of_features_and_ranges))
      3 all_options

OverflowError: long int too large to convert to int

二重whileループ、ツリー/再帰法 from here、別の再帰法 from hereを使用するなど、いくつかの代替アプローチを試しましたが、うまくいきませんでした....どんな助けも大歓迎です。

4

2 に答える 2

0

基になる numpy 配列とブール値ロジックを使用して、必要な行のみを含む配列を構築するのはどうですか?

dosage_df = pd.DataFrame((np.random.rand(40000,10)*100).astype(np.int))
dict_of_dose_ranges={3:[10,11,12,13,15,20],4:[20,22,23,24]}

#combined_doses will be bool array that will select all the lines that match the wanted combinations of doses

combined_doses=np.ones(dosage_df.shape[0]).astype(np.bool)
for item in dict_of_dose_ranges.items():
    #item[0] is the kind of dose
    #item[1] are the values of that kind of dose

    next_dose=np.zeros(dosage_df.shape[0]).astype(np.bool)

    #we then iterate over the wanted values
    for value in item[1]:
        # we select and "logical or" all lines matching the values
        next_dose|=(dosage_df[item[0]] == value)
    # we "logical and" all the kinds of dose
    combined_doses&=next_dose

print(dosage_df[combined_doses])
于 2016-09-07T21:21:26.480 に答える