несколько условий группирования и подсчета панд - PullRequest
1 голос
/ 01 июня 2019

Я собираюсь попытаться выразить эту проблему в наиболее общем виде. Предположим, у меня есть фрейм данных pandas с несколькими столбцами ['A', 'B', 'C', 'D'].

Для каждого уникального значения в 'A' мне нужно получить следующее соотношение: количество раз 'B' == x, деленное на количество раз 'B' == y, когда 'C' == q OR p ...

Извините, но я не знаю, как выразить это по-питонски.

Пример данных:

df = pd.DataFrame({'A': ['foo', 'zar', 'zar', 'bar', 'foo', 'bar','foo', 'bar', 'tar', 'foo', 'foo'],
'B': ['one', 'two', 'four', 'three', 'one', 'two', 'three','two', 'two', 'one', 'three'],
'C': np.random.randn(11),'D': np.random.randn(11)})`

Мне нужно что-то вроде следующего. Для каждого уникального значения i в 'A' мне нужно соотношение числа раз 'B' == 'one' к числу раз 'B' == 'two' при 'C' > 2.

Итак, вывод будет выглядеть примерно так: foo = 0.75

1 Ответ

1 голос
/ 01 июня 2019

Я умножил np.random.randn(11) на 10, чтобы могло существовать ограничение C > 2, поскольку np.random.randn(11) возвращает десятичные значения. Следующий код будет производить то, что вы хотите в шагах. Не стесняйтесь конденсировать. Кроме того, было неоднозначно, применяется ли ограничение C > 2 к числителю и знаменателю или только к знаменателю. Я предполагал только знаменатель. Если вам необходимо применить его к числителю, добавьте ограничение [df.C > 2] к переменной n. Кроме того, отношения, возвращаемые для этого текущего значения df, равны inf, если происходит деление на 0, и nan, если происходит 0, деленное на 0.

for i in df.A.unique():
    #print unique value
    print(f"Unique Val: {i}")

    #print numerator
    print("Numerator:")
    n = (df[df.A == i].B == 'one').sum()
    print(n)

    #print denominator
    print("Denominator:")
    d = (df[df.A == i][df.C > 2].B == 'two').sum()
    print(d)

    #print ratio
    print("Ratio:")
    r = n/d
    print(r, "\n")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...