Python 迭代数据帧并存储结果
我有一个数据框,看起来像这样:Python 迭代数据帧并存储结果,python,pandas,dataframe,Python,Pandas,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., 7
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] == i].index[0]
chain += f"--> {df.index[row]}"
except IndexError:
break
return chain
输出:
>>> build_string(df, 37)
'C24H31O8--> C23H27O9--> C22H23O10--> C21H19O11--> C20H15O12--> C19H11O13'
或
IIUC:
输出(out\u dict
):
谢谢你的回答,当我尝试使用一个循环并对所有值进行迭代时,37,74111,我需要得到不同的结果,你得到的结果是相同的,而且我不知道为什么我会进入无限循环,你应该编辑for循环37的内部,我不确定我是否遵循。我的代码中没有循环。您只需要提取,例如,
out\u dict[37.0]
?
>>> {int(i): build_string(df, i) for i in df.iloc[0] if i > 0}
{37: 'C24H31O8--> C23H27O9--> C22H23O10--> C21H19O11--> C20H15O12--> C19H11O13',
74: 'C24H31O8--> C22H23O10--> C20H15O12',
111: 'C24H31O8--> C21H19O11',
148: 'C24H31O8--> C20H15O12',
185: 'C24H31O8--> C19H11O13'}
df = pd.DataFrame(values, columns = columns)
s = df.where(df>0).stack()
out_dict = s.index.get_level_values(1).groupby(s)
{37.0: Index(['C23H27O9', 'C22H23O10', 'C21H19O11', 'C20H15O12', 'C19H11O13'], dtype='object'),
74.0: Index(['C22H23O10', 'C21H19O11', 'C20H15O12', 'C19H11O13'], dtype='object'),
111.0: Index(['C21H19O11', 'C20H15O12', 'C19H11O13'], dtype='object'),
148.0: Index(['C20H15O12', 'C19H11O13'], dtype='object'),
185.0: Index(['C19H11O13'], dtype='object')}