匹配ID中多列的值

2024-04-27 10:24:54 发布

您现在位置:Python中文网/ 问答频道 /正文

样品测向:

ID     Match1        Match2        Match3     Match4       Match5
1      Yes           No            Yes        Yes          Yes
2      Yes           No            Yes        Yes          No
2      Yes           No            No         Yes          Yes
3      No            Yes           Yes        Yes          No
3      No            Yes           No         No           No
4      Yes           No            Yes        No           No
4      Yes           No            Yes        Yes          Yes

预期DF:

 ID     Match1     Match2        Match3     Match4    Match5 Final_Match
    1      Yes      No            Yes        Yes      Yes     Clear
    2      Yes      No            Yes        Yes      No      Unclear
    2      Yes      No            No         Yes      Yes     Unclear
    3      No       Yes           Yes        Yes      No      Clear
    3      No       Yes           No         No       No      Unclear
    4      Yes      No            Yes        No       No      Unclear
    4      Yes      No            Yes        Yes      Yes     Clear

问题陈述:

  1. 如果ID是非重复的,只需将Clear放入Final_Match列(示例ID 1)
  2. 如果ID是重复的,那么在Match1到Match5列中的ID计数Yes内,取较大的“Yes”为该列放入Clear,为另一列放入Unclear(示例ID 3&4

  3. 如果ID是重复的,那么在Match1到Match5列中的ID计数Yes内,如果它们具有相等的“Yes”,则将Unclear放在这两个列中(示例ID 2)

我找不到任何关于如何在ID内求解的信息?


Tags: noid示例match样品yesfinal计数
3条回答

另一种方法是:

df['sum_yes']=df.iloc[:,1:6].eq('Yes').sum(axis=1)
df['final']=df.groupby('ID')['sum_yes'].transform\
             (lambda x: np.where((x==x.max())&(~x.duplicated(keep=False)),'Clear','Unclear'))
print(df)

   ID Match1 Match2 Match3 Match4 Match5  sum_yes    final
0   1    Yes     No    Yes    Yes    Yes        4    Clear
1   2    Yes     No    Yes    Yes     No        3  Unclear
2   2    Yes     No     No    Yes    Yes        3  Unclear
3   3     No    Yes    Yes    Yes     No        3    Clear
4   3     No    Yes     No     No     No        1  Unclear
5   4    Yes     No    Yes     No     No        2  Unclear
6   4    Yes     No    Yes    Yes    Yes        4    Clear

p.S如果需要,可以删除sum_yes列。你知道吗

使用pandas.DataFrame.groupby

final_match = []
for i, d in df.groupby('ID'):
    if len(d) == 1:
        final_match.append('Clear')
    else:
        counter = (d.filter(like='Match') == 'Yes').sum(1)
        if counter.nunique() == 1:
            final_match.extend(['Unclear'] * len(d))
        else:
            final_match.extend(counter.apply(lambda x: 'Clear' if x == max(counter) else 'Unclear').tolist())
df['final_match'] = final_match

print(df)
   ID Match1 Match2 Match3 Match4 Match5 final_match
0   1    Yes     No    Yes    Yes    Yes       Clear
1   2    Yes     No    Yes    Yes     No     Unclear
2   2    Yes     No     No    Yes    Yes     Unclear
3   3     No    Yes    Yes    Yes     No       Clear
4   3     No    Yes     No     No     No     Unclear
5   4    Yes     No    Yes     No     No     Unclear
6   4    Yes     No    Yes    Yes    Yes       Clear

说明:

  • len(d) == 1:如果不重复,则添加Clear
  • counter = (d.filter(like='Match') == 'Yes').sum(1):统计每列中“是”的数目
  • counter.nunique() == 1:如果所有行都有相同数量的“是”,那么所有行都被标记为“不清楚”
  • counter.apply(lambda x: 'Clear' if x == max(counter) else 'Unclear').tolist():如果行有不同的“Yes”计数,用“Clear”标记最高的,用“Unclear”标记其余的

您也可以通过使用Groupby.rank来实现这一点:

# Helper Series
s = (df.replace({'Yes': 1, 'No': 0})
     .iloc[:, 1:]
     .sum(1))

df['final_match'] = np.where(s.groupby(df['ID']).rank(ascending=False).eq(1), 'Clear', 'Unclear')

相关问题 更多 >