我需要從 Pandas 列中獲取化學屬性作為字典中的值,該字典作為類似 JSON 的字串讀入。我消除了大部分特殊字符,我想使用正則運算式在化學屬性旁邊用 casnumber 填充 3 個字典(例如,我想要一個字典對,鍵為 casnumber {1},值 {153 °C @ 按 12 托}。
這是我目前擁有的代碼 - 它正確地為我提供了包含字串“密度”、“熔點”和“沸點”的 casnumber,但我在某處使用 REGEX 函式來獲取“沸點”之間的字串屬性'和'sourceNumber'。
data = [
'''{name Boiling Point property 153 °C @ Press 12 Torr sourceNumber 1} {name Density property 0.9211 g/cm<sup>3</sup> @ Temp 20 °C sourceNumber 1}''',
'''{name Boiling Point property 58 °C @ Press 12 Torr sourceNumber 1} {name Density property 0.8753 g/cm<sup>3</sup> @ Temp 20 °C sourceNumber 1}''',
'''{name Boiling Point property 175.5-176 °C @ Press 763 Torr sourceNumber 1} {name Melting Point property -74.35 °C sourceNumber 1} {name Density property 0.8402 g/cm<sup>3</sup> @ Temp 25 °C sourceNumber 1}''',
'''{name Boiling Point property 103-105 °C @ Press 16 Torr sourceNumber 1} {name Melting Point property 51 °C sourceNumber 1}''']
casnumber = [
"1",
"2",
"3",
"4"]
df = pd.DataFrame(data, columns=['casnumber','experimental_properties'])
#create dicts for attributes
boiling_points = {}
melting_points = {}
densities = {}
for index, row in df.iterrows():
cas = str(row.casnumber)
experimental_property = str(row.experimental_properties)
if "Boiling Point" in experimental_property:
boiling_point = regex.match('Boiling Point property (.*?)sourceNumber', experimental_property)
boiling_points[cas] = boiling_point
if "Melting Point" in experimental_property:
melting_point = regex.match('Melting Point property (.*?)sourceNumber', experimental_property)
melting_points[cas] = melting_point
if "Density" in experimental_property:
density = regex.match('Density property (.*?)sourceNumber', experimental_property)
densities[cas] = density
這是 DF 的樣子:

當前的代碼給了我這個用于 rolling_points 字典:

這個電子表格是我想要的示例代碼(REGEX 函式應該從大字串中提取的內容):

我感謝您的幫助!這讓我一整天都難過。
uj5u.com熱心網友回復:
注意 regex.match 嘗試匹配字串的開頭。由于您的字串以{name開頭,您還需要考慮這一點。或者改為使用
regex.search('Boiling Point property (.*?)sourceNumber', experimental_property)回傳將是一個正則運算式匹配物件或
None. 您可以添加檢查是否回傳 None 并引發錯誤或列印陳述句。boiling_points[cas] = boiling_point.groups(1)然后應該給你你需要的東西。您可以進一步改進它以擺脫您的 if 陳述句。因為當沸點不存在時,正則運算式將回傳 None。
result = regex.search('Boiling Point property (.*?)sourceNumber', experimental_property)
if result is not None:
boiling_points[cas] = result.groups(1)
uj5u.com熱心網友回復:
有什么方法可以將您的資料從類似 JSON 的字串決議為 dict 并用于from_dict()制作您的資料框?然后,您可以將這些屬性中的每一個都放在它們自己的列中,并根據需要訪問它們。如果您必須為此使用正則運算式,那么在一開始就這樣做是有意義的,這可能有助于以后簡化資料訪問。
uj5u.com熱心網友回復:
從這個df獲取溫度:
df['value'] = df['data'].str.extract(r'(?<=property )(. ?)(?= sourceNumber)')
輸出:
| 級聯數 | 資料 | 價值 | |
|---|---|---|---|
| 0 | 1 | {name 沸點屬性 153 °C @ Press 12 Torr sourceNumber 1} {name Density property 0.9211 g/cm 3 @ Temp 20 °C sourceNumber 1} | 153 °C @ 按 12 托 |
| 1 | 2 | {名稱沸點特性 58 °C @ Press 12 Torr sourceNumber 1} {名稱密度特性 0.8753 g/cm 3 @ Temp 20 °C sourceNumber 1} | 58 °C @ 按 12 托 |
| 2 | 3 | {name Boiling Point property 175.5-176 °C @ Press 763 Torr sourceNumber 1} {name Melting Point property -74.35 °C sourceNumber 1} {name Density property 0.8402 g/cm 3 @ Temp 25 °C sourceNumber 1} | 175.5-176 °C @ 按 763 托 |
| 3 | 4 | {name Boiling Point property 103-105 °C @ Press 16 Torr sourceNumber 1} {name Melting Point property 51 °C sourceNumber 1} | 103-105 °C @ 按 16 托 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/513795.html
