如何解决解析数据框列的内容
我有一个数据框,其中的一列中存储有字符串。我想解析字符串的内容以创建其他列。
示例
import pandas as pd
import numpy as np
df = pd.DataFrame({'entry1': "30°C,pH 7.5,text some suff",'entry2': 'pH and temperature not available'},index=[0])
df = df.transpose()
print(df)
pH = []
temp = []
for l in list(df[0]):
for x in l.split(","):
pH.append(x) if 'pH' in x else np.NAN
temp.append(x) if '°C' in x else np.NAN
print(pH)
print(temp)
我已经尝试了上述方法,但未能获得最终结果。
预期结果:
df >
0 pH temp
entry1 30°C,text some suff 7.5 30
entry2 pH and temperature not available
我无法正确解析上面提供的代码示例中的pH值,我认为必须使用正则表达式。我们将高度赞赏有关如何获得预期输出的建议。
编辑: 根据下面给出的评论,我将添加更多测试用例。请检查以下可能性。
df = pd.DataFrame({'entry1': "30°C,'entry2': 'pH and temperature not available','entry3': "pH 14.0,30.7° C",'entry4': "30.7° C",'entry5': "pH 5.0",'entry6': "stuff",'entry7': "stuff before,30°C,text some suff"},index=[0])
解决方法
您可以通过以下正则表达式使用两个.str.extract
调用:
pH :\bpH\s*(\d+(?:\.\d+)?)
温度:(\d+(?:\.\d+)?)°\s*C\b
请参见regex demo #1和regex demo #2
详细信息
-
\bpH\s*(\d+(?:\.\d+)?)
:pH
被作为一个完整的单词匹配(\b
是单词边界),然后0或多个空格与\s*
匹配,然后是一个整数或浮点值被捕获到第1组(str.extract
的实际输出中)(\d+
匹配一个或多个数字,而(?:\.\d+)?
匹配一个点和一个1+个数字的可选序列) -
(\d+(?:\.\d+)?)°\s*C\b
:这将首先匹配并捕获一个整数或浮点数到第1组中,然后匹配一个°
子字符串,\s*
匹配0个或多个空格,然后C
为完全匹配。
Python使用示例:
df['pH'] = df[0].str.extract(r'\bpH\s*(\d+(?:\.\d+)?)',expand=False)
df['temp'] = df[0].str.extract(r'(\d+(?:\.\d+)?)°\s*C\b',expand=False)
输出:
>>> df
0 pH temp
entry1 30°C,pH 7.5,text some suff 7.5 30
entry2 pH and temperature not available NaN NaN
entry3 pH 14.0,30.7° C 14.0 30.7
entry4 30.7° C NaN 30.7
entry5 pH 5.0 5.0 NaN
entry6 stuff NaN NaN
entry7 stuff before,30°C,text some suff 7.5 30
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。