我有以下输入作为 df 的一列,每一行都是一个字符串:
surname: Chardon firstname: Marie occupation: idem link: fille age: 30
surname: Lhopital firstname: Louis-Jean occupation: sp link: chef age: 67
surname: Lavocat firstname: Marie link: femme birth_date: 1875 lob: Rigny
我想将此列转换为其自己的 df,其属性为
'surname', 'firstname', 'occupation', 'link', 'age', 'lob', 'birth_date'
。
最终结果应该是这样的
姓氏 | 名字 | 职业 | 链接 |
---|---|---|---|
查尔顿 | 玛丽 | 同上 | 填充物 |
洛必达 | 路易斯·让 | sp | 厨师 |
我怎样才能编写一个函数,将上面的输入转换到下面df?
本质上,我想获取属性名称和下一个属性名称之间的子字符串,并将其作为值连接到第一个属性。
困难:
各种。 尝试了各种 .split() 配置 尝试过正则表达式 用过ChatGPT,但没有效果。
我的(手动)方法如下所示:
cols = ['surname', 'firstname', 'occupation', 'link', 'age', 'lob', 'birth_date']
s1 = "surname: Chardon firstname: Marie occupation: idem link: fille age: 30"
所以我们从
开始surname: Chardon firstname: Marie occupation: idem link: fille age: 30
找到一种方法来分隔每个数据列,即:
for col in cols:
if f"{col:}" in s:
s = s.replace(f"{col:}", f'^{col}')
然后我们得到
^surname: Chardon ^firstname: Marie ^occupation: idem ^link: fille ^age: 30
(如果您的数据中未使用“^”以外的任何其他字符) 之后
s = s.split("^")
我们有
['', 'surname: Chardon ', 'firstname: Marie ', 'occupation: idem ', 'link: fille ', 'age: 30']
现在要将其变成字典,我们需要
for pair in s:
if pair:
k, v = pair.split(": ")
data[k] = v.strip()
获取
{'surname': 'Chardon', 'firstname': 'Marie', 'occupation': 'idem', 'link': 'fille', 'age': '30'}
完整代码看起来像这样
import pandas as pd
cols = ['surname', 'firstname', 'occupation', 'link', 'age', 'lob', 'birth_date']
s1 = "surname: Chardon firstname: Marie occupation: idem link: fille age: 30"
s2 = "surname: Lhopital firstname: Louis-Jean occupation: sp link: chef age: 67"
s3 = "surname: Lavocat firstname: Marie link: femme birth_date: 1875 lob: Rigny"
def f(s):
data = {}
for col in cols:
if f"{col:}" in s:
s = s.replace(f"{col:}", f'^{col}')
s = s.split("^")
for pair in s:
if pair:
k, v = pair.split(": ")
data[k] = v.strip()
return data
df = pd.DataFrame([f(s1), f(s2), f(s3)])
print(df)
结果是
surname firstname occupation link age birth_date lob
0 Chardon Marie idem fille 30 NaN NaN
1 Lhopital Louis-Jean sp chef 67 NaN NaN
2 Lavocat Marie NaN femme NaN 1875 Rigny