#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