我有一个项目列表,如">A2BCO6"one_answers"ABC2O6"。我想把它们替换成A2BCO6——比;AABCO6 and ABC2O6——比;CC O6。项目的数量远比这里展示的要多。
My dataframe is like:
listAB:
Finctional_Group
0 Ba2NbFeO6
1 Ba2ScIrO6
3 MnPb2WO6
我创建了一个重复的数组,并试图用以下方式替换:
B = ["Ba2", "Pb2"]
C = ["BaBa", "PbPb"]
for i,j in range(len(B)), range(len(C)):
listAB["Finctional_Group"]= listAB["Finctional_Group"].str.strip().str.replace(B[i], C[j])
但是它不能产生正确的输出。输出如下所示:
listAB:
Finctional_Group
0 PbPbNbFeO6
1 PbPbScIrO6
3 MnPb2WO6
请建议对代码进行必要的修改。
提前感谢。
为了简单起见,我使用了chemparse包,它似乎可以满足您的需求。
像往常一样,我们导入所需的包,在本例中是chemparse
和pandas
。
import chemparse
import pandas as pd
然后我们创建一个pandas.DataFrame
对象,就像你的例子中你的例子数据。
df = pd.DataFrame(
columns=["Finctional_Group"], data=["Ba2NbFeO6", "Ba2ScIrO6", "MnPb2WO6"]
)
我们解析器函数将使用chemparse.parse_formula
返回元素和它们的频率的dict分子式。
def parse_molecule(molecule: str) -> dict:
# initializing empty string
molecule_in_string = ""
# iterating over all key & values in dict
for key, value in chemparse.parse_formula(molecule).items():
# appending number of elements to string
molecule_in_string += key * int(value)
return molecule_in_string
molecule_in_string
现在包含没有数字的分子式。我们只需要将这个函数映射到数据框架列中的所有元素。我们可以这样做
df = df.applymap(parse_molecule)
print(df)
返回:
0 BaBaNbFeOOOOOO
1 BaBaScIrOOOOOO
2 MnPbPbWOOOOOO
dtype: object
chemparse的源代码:https://gitlab.com/gmboyer/chemparse