Как рассчитать процент отсчетов для условия в pandas?

#pandas #dataframe

#pandas #фрейм данных

Вопрос:

У меня есть фрейм данных, и я хочу вычислить процентное соотношение некоторой конкретной команды — уравнение ниже. $$ frac {N(A = a quad и quad B = 0)}{N(A = a)} $$

 id A B
0  a 0
1  b 1
2  c 0
3  a 1
4  a 1
  

Теперь я хочу получить этот конкретный процент:

 id A B  perc
0  a 0  0.3333
1  b 1  1.0
2  c 0  1.0
3  a 1  0.6666
  

Кроме того, мне нужна эта функция, в которой я могу отбрасывать строки в процентах. Например, если положительные значения 1 и отрицательные значения 0 приблизительно равны, я удалю эти строки.

 id A B
 0 a 0
 1 a 1
 2 b 0
 3 b 0
 4 b 1
  

Результатом будет:

 id A B
 2 b 0
 3 b 0
 4 b 1
  

Комментарии:

1. Как подсчитывается 0.3333 количество из выборочных данных?

2. Извините за опечатку. 1 строка не была введена.

3. Что это значит if the positives 1 and the negatives 0 are approximiately equal ?

4. Это означает, что для отдельного параметра A=? количество A=? and B=1 равно A=? and B=0 .

5. Хорошо, тогда мой ответ правильный. Супер!

Ответ №1:

Я думаю, вам нужно SeriesGroupBy.value_counts :

 df = df.groupby('A')['B'].value_counts(normalize=True).reset_index(name='perc')
print (df)
   A  B      perc
0  a  1  0.666667
1  a  0  0.333333
2  b  1  1.000000
3  c  0  1.000000
  

Для второго решения удалите значения, если одинаковые проценты по crosstab , получите значения A , сравнив оба столбца и последний фильтр по Series.isin с инвертированной маской по ~ :

 print (df)
   id  A  B
0   0  a  0
1   1  a  1
2   2  b  0
3   3  b  0
4   4  b  1

df1 = pd.crosstab(df['A'], df['B'], normalize='index')
print (df1)
B         0         1
A                    
a  0.500000  0.500000
b  0.666667  0.333333

idx = df1.index[df1[0].eq(df1[1])]
print (idx)
Index(['a'], dtype='object', name='A')

df = df[~df['A'].isin(idx)]
print (df)
   id  A  B
2   2  b  0
3   3  b  0
4   4  b  1