如何使用对另一列的值进行测试来填充pandas数据框列?

时间:2019-05-09 21:27:03

标签: pandas dataframe contains calculated-columns

在我问我的问题之前,我应该说我认为有一个简单的解决方案,我完全没有了。我已经在Google上搜索了答案,但与我所需要的却不很接近。

我试图找到一种方法来检查数据框的一列中的值,并根据该第一列使用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语句,但是我担心我的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)

1 个答案:

答案 0 :(得分: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