gpt4 book ai didi

Python - 按条件分组

转载 作者:行者123 更新时间:2023-12-05 05:54:56 25 4
gpt4 key购买 nike

我正在寻找一种优雅的方法来解决以下问题。

使用具有 15 列和 1250 行化合物信息(1250 种化合物)的 DataFrame。一个名为“molecular_mass”的特定列包含数字,我想将其用作句柄来创建每个包含 100 种化合物的组,其中组中每个化合物的“molecular_mass”数字不能在任何其他化合物的 +/- 1 范围内该组中的编号。

我正在执行以下操作以随机分组 100,但这并不能帮助我解决将“molecular_mass”数字与组中的任何其他数字分开 +/- 1 的问题。

import pandas as pd
df=pd.read_csv('data.csv')
df=df.sample(frac=1).reset_index(drop=TRUE)
SIZE=100
df['group']=df.index // SIZE
groups=[
df[df['group'] == num]
for num in range (df['group'].max()+1)]

从 data.csv 添加一些示例行

<表类="s-表"><头>化合物分子质量盘子列行溶解度<正文>AAA74.1211一个100/0BBB74.1234D100/0CCC76.1225H80/20DDD120.3610F50/50EEE121.311B100/0FFF119.311C100/0呜呜呜150.3513D100/0

data.csv 的格式为(显示了 6 个最重要的列)。

最佳答案

(SO 中的第一篇文章。帮助我找出我可以做得更好的地方。这不是一个 NumPy 的答案,但我希望它能有所帮助)

对于我的解决方案,我将创建一个空字典来存储化合物组并循环遍历表中给出的数据,同时检查(或迭代)每个组是否符合您描述的两个条件。

如果当前迭代组没有出现任何失败条件,它将把化合物追加到组中,否则它将转到下一个组或在字典上创建一个新组。

因为我不确定我是否能够在 numpy 中执行此操作,所以我创建了一个 Data 类来充当可返回化合物名称和化合物质量的可迭代对象。我希望您可以轻松地将这里的想法转化为您的代码。

使用下面的代码我得到了以下结果
{0: ['A', 'C', 'D', 'G'], 1: ['B', 'E', 'F']}

class Data:
compound = ["A", "B", "C", "D", "E", "F", "G"]
mass = [74.12, 74.12, 76.12, 120.3, 121.3, 119.3, 150.3]

def __init__(self):
assert len(self.compound) == len(self.mass)
self._current_index = 0

def __len__(self):
return len(self.compound)

def __getitem__(self, item):
member = self.compound[item], self.mass[item]
return member


MAX_COMPOUNDS_PER_GROUP = 100
MAX_WEIGHT_DELTA_IN_GROUP = 1

data = Data()
groups = dict()
for dd in data:
print(dd)
if len(groups) == 0:
print(f"group 0 created. added {dd[0]} to it")
groups[0] = [dd[0]]
continue
for group, comps_in_group in groups.items():
if len(comps_in_group) >= MAX_COMPOUNDS_PER_GROUP:
continue
for comp in comps_in_group:
comp_idx = data.compound.index(comp)
comp_mas = data.mass[comp_idx]
if abs(dd[1] - comp_mas) <= MAX_WEIGHT_DELTA_IN_GROUP:
break
else:
print(f"no mass conflict. appending {dd[0]} to group {group}")
comps_in_group.append(dd[0])
break
else:
print(
f"no group available. creating group {len(groups)} and adding"
f"{dd[0]}"
)
groups[len(groups)] = [dd[0]]
print(groups)

关于Python - 按条件分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69564135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com