我有一个看起来像这样的DataFrame:
columns = ['C24H31O8', 'C23H27O9', 'C22H23O10', 'C21H19O11', 'C20H15O12','C19H11O13']
values= [[ 0., 37., 74., 111., 148., 185.],
[ -37., 0., 37., 74., 111., 148.],
[ -74., -37., 0., 37., 74., 111.],
[-111., -74., -37., 0., 37., 74.],
[-148., -111., -74., -37., 0., 37.],
[-185., -148., -111., -74., -37., 0.]]
您可以通过使用轻松地重新创建我的数据框
df = pd.DataFrame(data=values, index=columns)
我想如下遍历我的数据框:
进行迭代时,在C24H31O8行中,在第1列中找到了37。现在,转到第1行,然后再次进行迭代。如果您再次找到数字37-在这种情况下,您在第三列中找到37-请转到第三行,然后再次搜索37,依此类推。
我想要的输出应该是一个链:
37 : C24H31O9 --> C23H27O9 --> C22H23O10 --> C21H19O11 ...
(为每个值做某事)
如果我正确理解了这个问题,这应该可以工作:
columns= pd.Index(['C24H31O8', 'C23H27O9', 'C22H23O10', 'C21H19O11', 'C20H15O12','C19H11O13'],dtype='object')
values=np.array([[ 0., 37., 74., 111., 148., 185.],
[ -37., 0., 37., 74., 111., 148.],
[ -74., -37., 0., 37., 74., 111.],
[-111., -74., -37., 0., 37., 74.],
[-148., -111., -74., -37., 0., 37.],
[-185., -148., -111., -74., -37., 0.]])
df = pd.DataFrame(values, columns)
def build_string(df, i):
row = 0
chain = df.index[0]
while True:
try:
row = df.iloc[row][df.iloc[row] == 37].index[0]
chain += f"--> {df.index[row]}"
except IndexError:
break
return chain
输出:
>>> build_string(df, 37)
'C24H31O8--> C23H27O9--> C22H23O10--> C21H19O11--> C20H15O12--> C19H11O13'
或
>>> for i in df.iloc[0]:
print(f"{int(i)}: {build_string(df, i)}")
0: C24H31O8--> C23H27O9--> C22H23O10--> C21H19O11--> C20H15O12--> C19H11O13
37: C24H31O8--> C23H27O9--> C22H23O10--> C21H19O11--> C20H15O12--> C19H11O13
74: C24H31O8--> C23H27O9--> C22H23O10--> C21H19O11--> C20H15O12--> C19H11O13
111: C24H31O8--> C23H27O9--> C22H23O10--> C21H19O11--> C20H15O12--> C19H11O13
148: C24H31O8--> C23H27O9--> C22H23O10--> C21H19O11--> C20H15O12--> C19H11O13
185: C24H31O8--> C23H27O9--> C22H23O10--> C21H19O11--> C20H15O12--> C19H11O13