首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将许多列归纳为独特的组合

如何将许多列归纳为独特的组合
EN

Stack Overflow用户
提问于 2022-03-21 06:19:15
回答 2查看 142关注 0票数 2

我有一份数据文件,其中列有行中的设备列表,以及一些实验的列,这些实验需要如下所示的设备:

代码语言:javascript
复制
equipment  exp-1 exp-2 ... exp-n
equip-1    T     F         T
.          .     .         .
equip-n    T     F         F

设备名称是字符串,布尔人定义设备是否需要用于给定的实验。我正试图将每个实验的所有不同设备要求浓缩成通用列表。最终目标是生成用于这组多个实验的设备列表。

通过执行以下步骤,我成功地做到了这一点:

  1. 转置数据并将所有布尔字段连接在一起,
  2. 获得这些级联值的所有唯一实例,
  3. 使用.loc迭代数据帧,并将合并的id分配给每一行
  4. 重复项。

G 210

最终结果如下:

代码语言:javascript
复制
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

然后,我能够再次转接这个,并将其重新插入原始数据帧中。因此,我现在有一个布尔列,用于每个组合,显示一个设备是否属于它。

代码语言:javascript
复制
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

我还需要得到一个列表,列出所有属于给定组合的实验:

代码语言:javascript
复制
combo 1: exp-1, exp-2, exp4
combo 2: exp-3, exp-5
...

我通过对合并的数据进行分组并打印出来实现了这一点。

是否有更干净的方法从最初的实验定义中得到我所需要的结果?我的方法似乎有点混乱。

编辑:初始步骤的代码,有一件事是,我的初始实现将布尔值作为字符串处理。在这种情况下,配置是我试图想出的一套设备的组合。

代码语言:javascript
复制
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中做了一个突出的例子,希望这有助于澄清最终目标。这些秘密是我想要生成的列。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-21 07:06:18

迭代列:

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
{'combo-0': ['eq1'], 'combo-1': [], 'combo-2': ['eq1', 'eq2', 'eq3']}
票数 1
EN

Stack Overflow用户

发布于 2022-03-21 06:32:38

我想你不需要把它贴回原来的数据。

最终目标就像你描述的那样。因此,就格式而言,最接近和最清晰的是使用字典/JSON结构。例如,

代码语言:javascript
复制
# A map of equip_concat to list of experiment names
combo_map = {
    'TFFTFTT...' : ['exp_1', 'exp_4', ...]
     },
    'TFTFTFT...' : ...
}

因此,只需循环您的数据和打印您的字典。

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71553484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档