I am going to assume that what you mean by:
delete least filled duplicate rows?
is to preserve the rows with the maximum number of responses rather than remove the rows with the least number of questions responded for a given email. If you want to remove the row per email group with the least number of responses I provided a modified version of Formula 1 at the end that satisfies this requirement.
Note: Based on your input data both approaches will produce the same result, but in a more general case the result will differ.
In cell F2
you can put the following formula (Formula 1);
=LET(emails, A2:A6, ans, B2:D6, cols, COLUMN(ans), ones, TOCOL(cols/cols),
nonEmpty, IF(ans <>"", 1, 0), counts, MMULT(nonEmpty, ones),
rank, MAP(emails, counts, LAMBDA(e,c, SUMPRODUCT((emails=e) * (counts > c))+1)),
out, FILTER(HSTACK(emails, ans), rank = 1),
IF(out=0, "", out)
)
and here is the output:

Note: This solution doesn't require helper columns to obtain the result.
Explanation
We use LET
function for easy reading and composition. We are going to count non-blanks via MMULT
. First, we identify non-empty answers as follows: IF(ans <>"", 1, 0)
and name it nonEmpty
. We define a unit vector (ones
) to do the multiplication and sum by row. The name counts
, has the output of MMULT(nonEmpty, ones)
. This is the corresponding output for the sample data:
3
2
1
1
2
Now we are going find the rank for rows within the same email based on counts
. The rank 1
will be for the email with the maximum number of answers, then rank 2
, and so on. For more information check the answer to the question: Set row maximum for FILTER formula provided by @DavidLeal. This is the condition to calculate the rank by descending order of counts
, and we name it rank
.
MAP(emails, counts, LAMBDA(e,c, SUMPRODUCT((emails=e) * (counts > c))+1))
Because we want to filter the result for emails with the maximum number of responses, then we filter by rank
equal to 1
. If we want to select also the row with the second most answered questions, then the condition will be instead rank <= 2
. So it allows you to customize the result you want to filter.
FILTER(HSTACK(emails, ans), rank = 1)
The final step is just to remove the 0
's generated by FILTER
with an empty string.
Note: Once we have counts
, there are multiple ways of achieving the same result. For example via DROP/REDUCE/VSTACK
pattern. Check the answer from this question: how to transform a table in Excel from vertical to horizontal but with different length from @DavidLeal:
=LET(emails, A2:A6, ans, B2:D6,
cols, COLUMN(ans), ones, TOCOL(cols/cols),
nonEmpty, IF(ans <>"", 1, 0), counts, MMULT(nonEmpty, ones),
uxEmails, UNIQUE(emails),
out, DROP(REDUCE("", uxEmails, LAMBDA(acc, email, LET(
maxCnt, MAX(FILTER(counts, emails=email)), result,
FILTER(HSTACK(emails, ans), (emails=email) * (counts = maxCnt)),
VSTACK(acc, result)))),1),
IF(out=0, "", out)
)
If one or more rows per unique email have the maximum number of responses, all corresponding rows will be returned.
In my opinion, the rank approach gives more flexibility in case you want to show rows with a wider range of rank values and it is a less verbose formula.
Exclude least filled duplicate rows
If you want instead to exclude the rows with the least number of responses for a given group, the Formula 1 can be modified as follow:
=LET(emails, A2:A6, ans, B2:D6, cols, COLUMN(ans), ones, TOCOL(cols/cols),
nonEmpty, IF(ans <>"", 1, 0), counts, MMULT(nonEmpty, ones),
rank, MAP(emails, counts, LAMBDA(e,c, SUMPRODUCT((emails=e) * (counts < c))+1)),
out, FILTER(HSTACK(emails, ans), rank > 1),
IF(out=0, "", out)
)
We made the following changes:
counts > c
-> counts < c
rank = 1
-> rank > 1
The first change reverses the rank, now the highest rank (rank =1
) will be the the email within a group with the least number of responses. So if we want to exclude it, we just filter for rank
greater than 1
.