嗨,我正在和熊猫一起工作,处理一些实验室数据。 我目前有一个5列的数据帧。
前三列(分析物,化学文摘社编号(1)和值)的顺序正确。 最后两列(CAS号2和值2)不是。
有没有一种方法可以根据匹配的CAS编号(又名CAS No(2)=CAS(NO1),将CAS No(2)和Value(2)与前三列对齐。
我对蟒蛇和熊猫是陌生的。 谢谢你的帮助
CAS无数据
您可以通过将df变量重新分配为其本身的一个片段来重新排序列,该片段索引在一个列表中,该列表的条目是有问题的列名。
colidx = ['Analyte', 'CAS NO(1)', 'CAS NO(2)']
df = df[colidx]
最好以文本格式提供输入数据,这样我们就可以复制粘贴它。 我理解您的问题是这样的:您需要将最后两列排序在一起,以便CAS NO(2)匹配CAS NO(1)。
因为CASNO(2)=CAS(NO1)
,所以不需要重复的CASNO(2)
列,对吗?
拆分最后两列并从中生成一个序列,然后将该序列转换为dict,并使用dict映射新值。
# Split 2 last columns and assign index.
df_tmp = df[['CAS NO(2)', 'Value(2)']]
df_tmp = df_tmp.set_index('CAS NO(2)')
# Keep only 3 first columns of original dataframe
df = df[['Analyte',' CASNo(1)', 'Value(1)']]
# Now copy the CasNO(1) to CAS NO(2)
df['CAS NO(2)'] = df['CasNO(1)']
# Now create Value(2) column on original dataframe
df['Value(2)'] = df['CASNo(1)'].map(df_tmp.to_dict()['Value(2)'])
请尝试以下操作:
#create an example of your table
list_CASNo1 = ['71-43-2', '100-41-4', np.nan, '1634-04-4']
list_Val1 = [np.nan]*len(list_CASNo1)
list_CASNo2 = [np.nan, np.nan, np.nan, '100-41-4']
list_Val2 = [np.nan, np.nan, np.nan, '18']
df = pd.DataFrame(zip(list_CASNo1, list_Val1, list_CASNo2, list_Val2), columns =['CASNo(1)','Value(1)','CAS NO(2)','Value(2)'], index = ['Benzene','Ethylbenzene','Gasonline Range Organics','Methyl-tert-butyl ether'])
#split the data to two dataframes
df1 = df[['CASNo(1)','Value(1)']]
df2 = df[['CAS NO(2)','Value(2)']]
#merge df2 to df1 based on the specified columns
#reset_index and set_index will take care
#that df_adjusted will have the same index names as df1
df_adjusted = df1.reset_index().merge(df2.dropna(),
how = 'left',
left_on = 'CASNo(1)',
right_on = 'CAS NO(2)').set_index('index')
但要小心列中的重复项,它们会导致合并失败。
希望有帮助!