提取 : 和预定义字符串集中的字符串之间的子字符串

问题描述 投票:0回答:1

我有以下输入作为 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

本质上,我想获取属性名称和下一个属性名称之间的子字符串,并将其作为值连接到第一个属性。

困难:

  • 某些值之间包含空格(例如,“Pierre Louis”作为名字),因此分割空格并连接每两个条目是行不通的
  • 属性列表因条目而异

各种。 尝试了各种 .split() 配置 尝试过正则表达式 用过ChatGPT,但没有效果。

python string dataframe substring
1个回答
0
投票

我的(手动)方法如下所示:

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
© www.soinside.com 2019 - 2024. All rights reserved.