python - 根据(分组)条件向 DataFrame 添加标志
问题描述
我正在使用具有以下结构的 pandas DataFrame:
df1 = pd.DataFrame({'left_name' : ['left_name1', 'left_name2', 'left_name3', 'left_name4', 'left_name5', 'right_name6', 'right_name7', 'right_name8'],
'right_name' : ['right_name1', 'right_name2', 'right_name2', 'right_name2', 'right_name3', 'right_name4', 'right_name4', 'right_name5'],
'score' : [0.98, 0.99, 0.97, 0.91, 1, 0.92, 0.90, 0.96]})
print(df1)
left_name right_name score
0 left_name1 right_name1 0.98
1 left_name2 right_name2 0.99
2 left_name3 right_name2 0.97
3 left_name4 right_name2 0.91
4 left_name5 right_name3 1.00
5 right_name6 right_name4 0.92
6 right_name7 right_name4 0.90
7 right_name8 right_name5 0.96
我想在上表中添加两个新列。从视觉上看,生成的 DataFrame 应该如下所示:
left_name right_name score col1 col2
0 left_name1 right_name1 0.98 MATCH 1
1 left_name2 right_name2 0.99 POTENTIAL 1
2 left_name3 right_name2 0.97 POTENTIAL 0
3 left_name4 right_name2 0.91 POTENTIAL 0
4 left_name5 right_name3 1.00 MATCH 1
5 right_name6 right_name4 0.92 POTENTIAL 1
6 right_name7 right_name4 0.90 POTENTIAL 0
7 right_name8 right_name5 0.96 MATCH 1
创建两个新列的规则如下:
- 对于
col1
系列:uniqueright_name
s 设置为MATCH
,duplicatesright_name
s 设置为POTENTIAL
。 - 对于
col2
系列:MATCH
es 被标记为1
;POTENTIAL
每组得分最高的 s 标记为 1right_name
(其余映射到0
);
我很难将上述规则转换为 Python/Pandas 代码。任何有关如何思考和编码的帮助将不胜感激。
解决方案
如果需要匹配每个组的最大值的解决方案 - 如果每个组存在1
值并且是max
,则选择它:
m = df1.groupby('right_name')['score'].transform('max').eq(df1['score']).astype(int)
df1['col1'] = np.where(df1['right_name'].duplicated(keep=False),'POTENTIAL', 'MATCH')
df1['col2'] = np.where(m, 1, 0)
print (df1)
left_name right_name score col1 col2
0 left_name1 right_name1 0.98 MATCH 1
1 left_name2 right_name2 0.99 POTENTIAL 1
2 left_name3 right_name2 0.97 POTENTIAL 0
3 left_name4 right_name2 0.91 POTENTIAL 0
4 left_name5 right_name3 1.00 MATCH 1
5 right_name6 right_name4 0.92 POTENTIAL 1
6 right_name7 right_name4 0.90 POTENTIAL 0
7 right_name8 right_name5 0.96 MATCH 1
或删除所有行,使用for bitwise1
获得每个组的最大值,并添加1
行:|
OR
m = (df1[df1['score'].ne(1)]
.groupby('right_name')['score'].transform('max')
.eq(df1['score']).astype(int))
df1['col1'] = np.where(df1['right_name'].duplicated(keep=False),'POTENTIAL', 'MATCH')
df1['col2'] = np.where(m | df1['score'].eq(1), 1, 0)
print (df1)
left_name right_name score col1 col2
0 left_name1 right_name1 0.98 MATCH 1
1 left_name2 right_name2 0.99 POTENTIAL 1
2 left_name3 right_name2 0.97 POTENTIAL 0
3 left_name4 right_name2 0.91 POTENTIAL 0
4 left_name5 right_name3 1.00 MATCH 1
5 right_name6 right_name4 0.92 POTENTIAL 1
6 right_name7 right_name4 0.90 POTENTIAL 0
7 right_name8 right_name5 0.96 MATCH 1
检查更改的样本数据的差异:
df1 = pd.DataFrame({'left_name' : ['left_name1', 'left_name2', 'left_name3', 'left_name4', 'left_name5', 'right_name6', 'right_name7', 'right_name8'],
'right_name' : ['right_name1', 'right_name2', 'right_name2', 'right_name2', 'right_name3', 'right_name4', 'right_name4', 'right_name5'],
'score' : [0.98, 0.99, 0.97, 0.91, 1, 1.00, 0.90, 0.96]})
#print(df1)
m1 = df1.groupby('right_name')['score'].transform('max').eq(df1['score']).astype(int)
m2 = df1[df1['score'].ne(1)].groupby('right_name')['score'].transform('max').eq(df1['score']).astype(int)
df1['col1'] = np.where(df1['right_name'].duplicated(keep=False),'POTENTIAL', 'MATCH')
df1['col21'] = np.where(m, 1, 0)
df1['col22'] = np.where(m2 | df1['score'].eq(1), 1, 0)
print (df1)
left_name right_name score col1 col21 col22
0 left_name1 right_name1 0.98 MATCH 1 1
1 left_name2 right_name2 0.99 POTENTIAL 1 1
2 left_name3 right_name2 0.97 POTENTIAL 0 0
3 left_name4 right_name2 0.91 POTENTIAL 0 0
4 left_name5 right_name3 1.00 MATCH 0 1
5 right_name6 right_name4 1.00 POTENTIAL 1 1
6 right_name7 right_name4 0.90 POTENTIAL 0 1
7 right_name8 right_name5 0.96 MATCH 1 1
推荐阅读
- docusignapi - 具有只读功能的 Docusign 嵌入式发件人
- kubernetes - 为 Kubernetes 设置 IBM Cloud Log Analysis (E0004)
- python - 创建二维 NumPy 数组(Python)
- c# - .Net Core 项目类型,用于与多个项目共享布局
- javascript - 按换行符拆分字符串,保留引用的段
- .net - 如何在 .NET 中从 BIM 360 获取项目的标记和问题
- angular - Unable to submit form with button outside of content (Ionic 4)
- c++ - Cause of std::system_error
- python-3.x - 使用scrapy关注新闻链接
- sql - 之间的区别:NOT IN(IS NOT NULL)VS IN(IS NULL)