【问题标题】:Labeling data based on string value in python基于python中的字符串值标记数据
【发布时间】:2019-11-17 10:27:06
【问题描述】:

我有一个包含 8000 行的数据框,其中 job_name 列包含带有短“作业标题”的字符串(见下文)。 我创建了不同的列表,其中包含我想要分组的各个职位。

job_hilfskraft = ['bretreuungskraft', 'pflegehilfskraft', 'pflegehelfer', 'krankenpflegehelfer','altenpflegerhelfer', 'pflegeassistent','pflegeassistenz','pflegehilfskräfte', 'pflegeassistenten', 'altenpflegehilfskraft', 'pflegeassistentin','altenpflegehelfer']
job_fachkraft = ['pflegefachkraft', 'altenpfleger','pflegefachkräfte','altenpflegerin', 'pflegekraft', 'krankenpfleger', 'krankenpfleger', 'altenpflegerin', 'altenpflegefachkraft', 'pflegemitarbeiter']
job_leitung = ['pflegedienstleitung', 'pflegedienstleiter', 'wohnbereichsleiter', 'einrichtungsleiter']
job_sonstige = ['küchenhilfskraft', 'reinigungskraft', 'küchenleiter', 'servicekraft', 'spülkraft', 'empfangskraft']

包含工作职位的字符串示例。

    job_name
0   Küchenhilfskraft in Teilzeit gesucht!
1   Examinierter Krankenpfleger in ambulanter Station

期望的输出:

        job_name                                        job_label
0   Küchenhilfskraft in Teilzeit gesucht!               sonstige
1   Examinierter Krankenpfleger in ambulanter Station   fachkraft

我用

df['job_label'] = ""

df['job_label'][df.job_name.str.contains('|'.join(job_hilfskraft))] = 'hilfskraft'
df['job_label'][df.job_name.str.contains('|'.join(job_leitung))] = 'leitung'
df['job_label'][df.job_name.str.contains('|'.join(job_sonstige))] = 'sonstige'
df['job_label'][df.job_name.str.contains('|'.join(job_fachkraft))] = 'fachkraft'

但它不会将标签分配给相应的行或仅少数...(

我还收到每个“包含”行的消息:

SettingWithCopyWarning: 正在尝试在 DataFrame 中的切片副本上设置值

【问题讨论】:

    标签: python pandas pandas-groupby contains


    【解决方案1】:

    这应该可以解决您当前的问题。

    df['job_label'] = ""
    
    df.loc[df.job_name.str.contains('|'.join(job_hilfskraft)), 'job_label'] = 'hilfskraft'
    df.loc[df.job_name.str.contains('|'.join(job_leitung)), 'job_label'] = 'leitung'
    df.loc[df.job_name.str.contains('|'.join(job_sonstige)), 'job_label'] = 'sonstige'
    df.loc[df.job_name.str.contains('|'.join(job_fachkraft)), 'job_label'] = 'fachkraft'
    

    我可能会这样写:

    lookup = {'hilfskraft': ['bretreuungskraft', 'pflegehilfskraft', 'pflegehelfer', 'krankenpflegehelfer','altenpflegerhelfer', 'pflegeassistent','pflegeassistenz','pflegehilfskräfte', 'pflegeassistenten', 'altenpflegehilfskraft', 'pflegeassistentin','altenpflegehelfer'],
    'fachkraft': ['pflegefachkraft', 'altenpfleger','pflegefachkräfte','altenpflegerin', 'pflegekraft', 'krankenpfleger', 'krankenpfleger', 'altenpflegerin', 'altenpflegefachkraft', 'pflegemitarbeiter'],
    'leitung': ['pflegedienstleitung', 'pflegedienstleiter', 'wohnbereichsleiter', 'einrichtungsleiter'],
    'sonstige': ['küchenhilfskraft', 'reinigungskraft', 'küchenleiter', 'servicekraft', 'spülkraft', 'empfangskraft']}
    
    
    df['job_label'] = ""
    
    for replace, keywords in lookup.items():
        for k in keywords:
            df.loc[df.job_name.str.contains(k, case=False, regex=False), 'job_label'] = replace
    

    【讨论】:

    • 很遗憾没用。结果和以前一样。实际上,我刚刚意识到它仅将“hilfskraft”分配给某些行(但不是所有应分配的行),而没有分配其他标签。
    • 如果您收到与以前相同的警告,则可能是您未共享此问题的其他上下文。 df.job_name.str.contains('|'.join(job_hilfskraft)) 会生成一个看起来正确的布尔系列吗?
    • 抱歉,警告确实消失了。
    • 如果您确定字符串是正确的,我希望无论如何都能正常工作 - 您可以使用 regex=False 中的 regex=False 解决 unicode 问题
    • 另外看看你的例子,你可能还希望在str.contains() 中设置case=False
    猜你喜欢
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多