Python 在数据库中跨多个列迭代并动态切片

Python 在数据库中跨多个列迭代并动态切片,python,pandas,machine-learning,scikit-learn,grid-search,Python,Pandas,Machine Learning,Scikit Learn,Grid Search,TLDR:如何在不显式指定列或其值的情况下,遍历数据帧中多个列的所有选项 长版本:我有一个熊猫数据框,看起来像这样,只是它有比这里列出的更多的特性或药物剂量组合。而不是仅仅3种类型的功能,它可以有大约70…: > dosage_df First Score Last Score A_dose B_dose C_dose 22 28 1 40 130 55 11 2 40

TLDR:如何在不显式指定列或其值的情况下,遍历数据帧中多个列的所有选项

长版本:我有一个熊猫数据框,看起来像这样,只是它有比这里列出的更多的特性或药物剂量组合。而不是仅仅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我现在可以迭代所有的_选项,但我不确定现在如何从每个字典选项中选择我的剂量_df,即{'A_剂量:1,'B_剂量:40,'C_剂量: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循环、a循环和另一个循环,但它们没有结合在一起。。。。非常感谢您的帮助

使用底层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])
您可以使用生成所有可能的剂量组合,并进行选择:

from itertools import product

for dosage_comb in product(*dict_of_dose_ranges.values()):
    dosage_items = zip(dict_of_dose_ranges.keys(), dosage_comb)
    query_str = ' & '.join('{} == {}'.format(*x) for x in dosage_items)
    sub_df = dosage_df.query(query_str)

    # Do Stuff...

你能让它工作吗?我得到了一个错误:索引器:只有整数、切片:、省略号…、numpy.newaxis None和整数或布尔数组是有效的指示符我编辑了一点代码以更正错误arr[:,item[0]],并将arthmetic替换为按位运算符,并添加了示例值,因此它是可复制/可复制的。现在,它对我来说运行良好。我认为它只适用于您b/c剂量范围的dose_df和dict_列具有整数键。@Afflatus我修复了它,它现在应该适用于所有列名。