Подсчет процента раз, когда значения в двух отдельных столбцах не равны для кадра данных - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть набор данных с 5 столбцами:

0   1   2   3   4
A   Y   N   N   Y
B   N   Y   N   N
C   N   N   N   N
D   Y   Y   N   Y
E   N   Y   Y   Y
F   Y   Y   N   Y
G   Y   N   N   Y

Я хочу рассчитать процентное соотношение случаев, когда в столбцах 3 и 4 появляется объединенный Y, и процент времени, в котором N появляется в этих двух столбцах вместе.

Я знаю, как сделать это индивидуально, используя

df['3'].value_counts(normalize=True) * 100

Но не могу понять, как это сделать с 3 и 4 комбинациями.

Ответы [ 4 ]

0 голосов
/ 09 декабря 2018

Использование melt

df[['3','4']].melt().value.value_counts(normalize=True)
Out[8]: 
N    0.571429
Y    0.428571
Name: value, dtype: float64
0 голосов
/ 09 декабря 2018

Вы можете получить value_counts для обоих столбцов 3 и 4, смешав их вместе:

df[['3','4']].melt().value.value_counts(normalize=True) * 100

Вывод:

N    57.142857
Y    42.857143
Name: value, dtype: float64

Это дает количество раз Y и N отображаются в столбцах 3 или 4 в процентах от общего количества записей в обоих столбцах.Если вместо этого вы хотите, чтобы число раз N или Y отображалось в обоих столбцах, можно объединить строки в каждом столбце и затем подсчитать комбинации:

(df['3'] + df['4']).value_counts(normalize=True) * 100

Вывод:

NY    57.142857
NN    28.571429
YY    14.285714
dtype: float64

Тестирование

Вот полный код, который я использовал для генерации выходных данных в ответе выше:

import pandas as pd
from io import StringIO

d = '''0   1   2   3   4
A   Y   N   N   Y
B   N   Y   N   N
C   N   N   N   N
D   Y   Y   N   Y
E   N   Y   Y   Y
F   Y   Y   N   Y
G   Y   N   N   Y'''

df = pd.read_csv(StringIO(d), sep='\s+')

totalcount = df[['3','4']].melt().value.value_counts(normalize=True) * 100
print('percentage of times each value appears as an entry in either column\n%s\n' % totalcount)

paircount = (df['3'] + df['4']).value_counts(normalize=True) * 100
print('percentage of times each pair of values occurs across columns\n%s\n' % paircount)
0 голосов
/ 09 декабря 2018

Использование:

print((df['3']+df['4'])[~(df['3']+df['4']).isin(['NY','YN'])].value_counts(normalize=True)*100)

Вывод:

NN    66.666667
YY    33.333333
dtype: float64
0 голосов
/ 09 декабря 2018

Для подсчета, где Y существует в обоих столбцах 3 и 4

((df['3']=='Y') & (df['4']=='Y')).value_counts(normalize=True) * 100

Для подсчета, где N существует в обоих столбцах 3 и 4

((df['3']=='N') & (df['4']=='N')).value_counts(normalize=True) * 100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...