Предположим, у меня есть фрейм данных Python, который выглядит примерно так:

Factor_1    Factor_2    Factor_3   Factor_4   Factor_5
   A           B           A          Nan       Nan
   B           D           F          A         Nan
   F           A           D          B          A

Примерно так, у меня есть 5 столбцов с разными коэффициентами. Я хотел бы создать столбец, который подсчитывает, сколько из этих факторов появляется в dtaframe, но без двойного подсчета, в каких терминах без двойного подсчета, если значение появляется в одной строке, оно считается только как 1, например, если в одной строке есть A, B , C, A, A будет учитываться только 1 A. Ожидаемый результат будет таким.

Factor   Count
  A        3
  B        3
  D        2
  F        2
 Nan       2

Я использовал код, с которым мне помогли

df.stack(dropna=False).value_counts(dropna=False)

Я использовал if, чтобы отбросить двойной счет, но я хотел бы знать, есть ли практичный и простой способ сделать это, например, код выше, а не с If, потому что то, что я делаю, неэффективно.

3
Pandas INC 14 Сен 2020 в 17:40

2 ответа

Лучший ответ

Вы можете использовать Series.unique + Series.value_counts:

s = pd.Series(np.hstack(df.T.apply(pd.Series.unique))).value_counts(dropna=False)

B      3
A      3
F      2
D      2
NaN    2
dtype: int64
2
Shubham Sharma 14 Сен 2020 в 14:55

Вот способ следовать вашей логике, дополнительно связывая условную проверку с помощью groupby на level=0

s = df.stack(dropna=False)
s.groupby(level=0).apply(lambda x: x[~x.duplicated()]).value_counts(dropna=False)

A      3
B      3
D      2
F      2
NaN    2
dtype: int64
2
anky 14 Сен 2020 в 14:58