繁体   English   中英

基于包含分隔符的现有 df 列创建 df 列

[英]Create df columns based on an existing df column that contains delimiters

我的 pandas df的一列看起来像这样。 它是一个带有-作为分隔符的长字符串。 这个长字符串包含特定产品的一些特征。

Water Resistant: 10 ATM - Diameter: 48 mm - Sex: Man - Material: RVS IP Gun - Movement: Quartz - Functionality: Alleen Tijd - Glass: Mineraal

我想为每个 object 特性在相同的df中创建列:防水、直径、性别等。

最终结果应类似于:

Water resistance    Diameter    Sex    Material    Movement
10 ATM              48 mm       Man    RVS IP Gun  Quartz

还有一些产品没有描述。 在这种情况下, df应该如下所示:

Water resistance    Diameter    Sex    Material    Movement
10 ATM              48 mm       Man    RVS IP Gun  Quartz
-                   47 mm       Woman  -           Quartz
10 ATM              -           Woman  UIS         - 

我怎样才能做到这一点?

使用正则表达式和pd.DataFrame.from_records

前任:

import re

s = "Water Resistant: 10 ATM - Diameter: 48 mm - Sex: Man - Material: RVS IP Gun - Movement: Quartz - Functionality: Alleen Tijd - Glass: Mineraal"

ptrn = re.compile(r"([\w\s]+):\s*([\w\s]+)")
df = pd.DataFrame.from_records([dict(ptrn.findall(s))])
print(df)

Output:

  Water Resistant  Diameter   Sex     Material  Movement  Functionality     Glass
0         10 ATM     48 mm   Man   RVS IP Gun    Quartz    Alleen Tijd   Mineraal

我假设你有这个 dataframe:

                                                col1
0  Water Resistant: 10 ATM - Diameter: 48 mm - Se...
1  Diameter: 47 mm - Sex: Woman - Movement: Quart...
2  Water Resistant: 13 ATM - Sex: Woman - Materia...

然后:

df_out = pd.DataFrame(
    df["col1"]
    .apply(
        lambda x: {
            line.split(":")[0]: line.split(":")[1].strip()
            for line in x.split(" - ")
        }
    )
    .tolist()
).fillna("-")
print(df_out)

印刷:

  Water Resistant Diameter    Sex    Material Movement Functionality     Glass
0          10 ATM    48 mm    Man  RVS IP Gun   Quartz   Alleen Tijd  Mineraal
1               -    47 mm  Woman           -   Quartz   Alleen Tijd  Mineraal
2          13 ATM        -  Woman         UIS        -   Alleen Tijd  Mineraal

编辑:处理NaN和边缘情况:

def fn(x):
    if pd.isna(x):
        return {}

    out = {}
    for line in x.split(" - "):
        if ":" in line:
            k, v = map(str.strip, line.split(":"))
            out[k] = v
    return out


df_out = pd.DataFrame(df["col1"].apply(fn).tolist()).fillna("-")
print(df_out)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM