我有一份数据文件,其中列有行中的设备列表,以及一些实验的列,这些实验需要如下所示的设备:
equipment exp-1 exp-2 ... exp-n
equip-1 T F T
. . . .
equip-n T F F设备名称是字符串,布尔人定义设备是否需要用于给定的实验。我正试图将每个实验的所有不同设备要求浓缩成通用列表。最终目标是生成用于这组多个实验的设备列表。
通过执行以下步骤,我成功地做到了这一点:
G 210
最终结果如下:
experiment equip-1 ... equip-n equip-concat combo
exp-1 T T T...T 0
exp-2 F F F...F 1
exp-3 T F T...F 2然后,我能够再次转接这个,并将其重新插入原始数据帧中。因此,我现在有一个布尔列,用于每个组合,显示一个设备是否属于它。
equipment exp-1 exp-2 ... exp-n combo-1 ...combo-n
equip-1 T F T T F
. . . .
equip-n T F F F F我还需要得到一个列表,列出所有属于给定组合的实验:
combo 1: exp-1, exp-2, exp4
combo 2: exp-3, exp-5
...我通过对合并的数据进行分组并打印出来实现了这一点。
是否有更干净的方法从最初的实验定义中得到我所需要的结果?我的方法似乎有点混乱。
编辑:初始步骤的代码,有一件事是,我的初始实现将布尔值作为字符串处理。在这种情况下,配置是我试图想出的一套设备的组合。
dfexp = df.copy().set_index("equipment").transpose()
dfexpagg = dftests.agg("".join, axis=1)
dfexpagg.name = "Agg Gear"
dfexp["aggregated_gear"] = dfexpagg
unique_configs = dfexp["aggregated_gear"].unique()
for x, config in enumerate(unique_configs):
dfexp.loc[dfexp["aggregated_gear"] == config, "Config"] = str(x)
dfconfigs = dfexp.set_index("Config"), drop=True).drop("aggregated_gear", axis=1).drop_duplicates().transpose()我在excel中做了一个突出的例子,希望这有助于澄清最终目标。这些秘密是我想要生成的列。

发布于 2022-03-21 07:06:18
迭代列:
df = pd.DataFrame([['T', 'F', 'T','T'], ['F', 'F', 'T','F'], ['F', 'F','T','F']], index = ['eq1', 'eq2', 'eq3'], columns = ['ex1', 'ex2', 'ex3', 'ex4'])
output = {}
for i, col in enumerate(df.columns):
temp = df.index[df[col] == 'T'].tolist()
if temp not in output.values():
output[f'combo-{i}'] = temp输出:
{'combo-0': ['eq1'], 'combo-1': [], 'combo-2': ['eq1', 'eq2', 'eq3']}发布于 2022-03-21 06:32:38
我想你不需要把它贴回原来的数据。
最终目标就像你描述的那样。因此,就格式而言,最接近和最清晰的是使用字典/JSON结构。例如,
# A map of equip_concat to list of experiment names
combo_map = {
'TFFTFTT...' : ['exp_1', 'exp_4', ...]
},
'TFTFTFT...' : ...
}因此,只需循环您的数据和打印您的字典。
combo_map = {}
for index, row in df.iterrows():
equip_concat = row['equip-concat']
if equip_concat not in combo_map:
combo_map[equip_concat] = []
combo_map[equip_concat].append(row['experiment'])
print(combo_map)https://stackoverflow.com/questions/71553484
复制相似问题