如何使用对另一列值的测试来填充 pandas 数据框列?
How can I populate a pandas dataframe column with tests on the value of another column?
在我问我的问题之前,我应该说我认为有一个我完全想念的简单解决方案。我搜索了 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 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)
请注意,这是基于您的 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
在我问我的问题之前,我应该说我认为有一个我完全想念的简单解决方案。我搜索了 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 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)
请注意,这是基于您的 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