Python и Pandas: как подсчитать столбец с определенным условием c - PullRequest
0 голосов
/ 13 июля 2020

Я новичок в Pandas с Python, и я хочу попросить о помощи с чем-то, что, по моему мнению, легко для кого-то более опытного, чем я.

У меня есть файл журнала, в котором в этом файле есть несколько столбцов. Эти столбцы могут иметь разные состояния.

Я думаю, что пример лучше:

ID | ANSWER | DETAIL | .. | OTHERS
12345 | Complete | Answer_OK | .. | whatever
12346 | Incomplete | Answer_NOK | .. | whatever
12345 | Complete | Answer_NOK | .. | whatever

Затем мне нужно подсчитать записи «ID», когда ответ = Incomplete, но не подсчитывать, когда «ID» имеет «Answer_OK» и в то же время «Answer_NOK».

В Excel это довольно просто, потому что вы создаете динамическую c таблицу и новый столбец, в который помещаете предложение IF, которое проверяет (IF A1 > 0 and A2 > 0, 0, 1), а позже вы суммируете новый столбец и получаете номер, но в Pandas я не могу сделать это легко.

Ответы [ 2 ]

0 голосов
/ 13 июля 2020
import pandas as pd
import numpy as np

df = your_dataframe

df_grouped = df.groupby(["ID"]).aggregate({"ANSWER":list, "DETAIL":list}).reset_index()
mask = df_grouped["ANSWER"].map(lambda x: "Incomplete" in x) & ~(df_grouped["DETAIL"].map(lambda x: "Answer_OK" in x) & df_grouped["DETAIL"].map(lambda x: "Answer_NOK" in x))

print(np.sum(mask))

Ваш идентификатор не уникален, поэтому вы можете сначала сгруппировать фрейм данных (например, сводную таблицу Excel) и получить список значений, которые идентификатор имеет для «ОТВЕТ» и «ДЕТАЛИ». Тогда у вас есть новый фрейм данных с уникальным идентификатором. С помощью этого фрейма данных вы можете создать серию, состоящую из True / False, отвечающую требованиям вашего фильтра.

Затем вы можете использовать numpy для вычисления суммы «True» в этой серии.

0 голосов
/ 13 июля 2020

Для этого вы можете использовать функцию .loc []. Например, для того, что вы пытаетесь сделать, вы должны сделать df = df.loc[df["answer"]=="Incomplete"] Затем в следующей строке вы просто сделаете это снова для других значений, которые хотите df = df.loc[df["details"]=="Answer_NOK"], тогда df будет равняться желаемому фрейму данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...