【问题标题】:How can I populate a pandas dataframe column with tests on the value of another column?如何使用对另一列值的测试来填充 pandas 数据框列?
【发布时间】:2019-05-09 21:27:02
【问题描述】:

在我问我的问题之前,我应该说我认为有一个我完全错过的简单解决方案。我已经在谷歌上搜索了答案并接近但并不完全符合我的需要。

我正在尝试找到一种方法来检查数据框的一列中的值,并根据第一列使用 4 个值中的一个填充另一个新列。

我已经尝试做几件事来了解我正在做的事情。由于我的“outcome_notes”列没有标准化结果,我希望将结果标准化为 4 类:

完成 待办的 不完整 已取消

我可以试试:

df1['outcome'].map({'complete': 'Complete', 'incomplete': 'Incomplete', 'Pending': 'Pending'})

但我的完整数据集中大约有 200 个唯一值。

我也尝试过使用它,但不确定如何让它填充列:

df1[df1['outcome_notes'].str.contains(r'\bcomplete', na=False)]

我尝试使用此选择创建新的数据框,然后将它们全部合并,但它最终提供了数千个额外的行。

我一直在为 if then 语句而苦苦挣扎,但我担心我的 python 技能会成功,所以我实际上不知道如何正确设计这个逻辑。

import pandas as pd
d  = {'id': ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'], 'outcome_notes': ['complete', 'pending', 'incomplete', 'canceled', 'completed', 'complete', '', 'completed -- doctor says', 'canceled due to doctor', '']}

df1 = pd.DataFrame(data=d)

我真的很想要一个看起来像这样的数据框:

d  = {'id': ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'], 'outcome_notes': ['complete', 'pending', 'incomplete', 'canceled', 'completed', 'complete', '', 'completed -- doctor says', 'canceled due to doctor', ''], 'outcome': 'Complete', 'Pending', 'Incomplete', 'Canceled', 'Complete', 'Complete', '', 'Complete', 'Canceled', '']}

df1 = pd.DataFrame(data=d)

【问题讨论】:

    标签: pandas dataframe contains calculated-columns


    【解决方案1】:

    请注意,这是基于您的 outcome_notes 中没有拼写错误。 str.findall

    s=df1.outcome_notes
    df1['New']=s.str.findall('|'.join(s.iloc[:4])).str[0]
    df1
    Out[449]: 
       id             outcome_notes         New
    0   1                  complete    complete
    1   2                   pending     pending
    2   3                incomplete  incomplete
    3   4                  canceled    canceled
    4   5                 completed    complete
    5   6                  complete    complete
    6   7                                   NaN
    7   8  completed -- doctor says    complete
    8   9    canceled due to doctor    canceled
    9  10                                   NaN
    

    模糊匹配

    from fuzzywuzzy import process
    a=s.iloc[:4]
    matchdf=pd.DataFrame(s.map(lambda x : process.extract(x, a, limit=1)).str[0].tolist(),index=df1.index)
    df1['New2']=matchdf.loc[matchdf[1]>60,0]
    df1
    Out[482]: 
       id             outcome_notes         New        New2
    0   1                  complete    complete    complete
    1   2                   pending     pending     pending
    2   3                incomplete  incomplete  incomplete
    3   4                  canceled    canceled    canceled
    4   5                 completed    complete    complete
    5   6                  complete    complete    complete
    6   7                                   NaN         NaN
    7   8  completed -- doctor says    complete    complete
    8   9    canceled due to doctor    canceled    canceled
    9  10                                   NaN         NaN
    

    【讨论】:

    • 我只提供了一部分我的实际数据,不幸的是有不少拼写不一致的地方。话虽如此,我认为我无法解决所有奇怪的异常值,所以这应该是朝着正确方向迈出的一大步。谢谢!
    • @EduardoX 让我为您提供另一种基于模糊匹配的解决方案
    • 定义a时:``` a=s.iloc[:4] 的目标是从s中获取前4个值吗?我可以用我想要的 4 个值替换 a 吗?
    • @EduardoX 是的,你可以,只需执行一个 = ['Val1','Val2'...]
    猜你喜欢
    • 2021-06-26
    • 2020-11-26
    • 2019-12-09
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多