Python和Pandas:如何计算具有特定条件的列

时间:2020-07-12 23:18:00

标签: python anaconda

我是使用Python的Pandas的新手,我想寻求一些我认为比我有经验的人容易的帮助。

我有一个LOG文件,该文件有几列。这些列可以具有不同的状态。

我认为一个例子更好:

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

然后,当Answer =不完整时,我需要对“ ID”记录进行计数,但是当“ ID”具有“ Answer_OK”并且同时具有“ Answer_NOK”时,无需计数。

在excel中非常容易,因为您创建了一个动态表和一个新列,并放置了一个检查(IF A1 > 0 and A2 > 0, 0, 1)的IF语句,然后将新列求和并得到了数字,但是在Pandas中,我可以没那么容易。

2 个答案:

答案 0 :(得分:0)

您可以使用.loc []函数。例如,对于您想做的事情,您会做 df = df.loc[df["answer"]=="Incomplete"] 然后在下一行中,对您想要的其他值再次进行df = df.loc[df["details"]=="Answer_NOK"] 则df将等于您想要的数据框。

答案 1 :(得分:0)

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))

您的ID不是唯一的,因此您可以首先对数据框进行分组(例如excel数据透视表),并获取ID包含“ ANSWER”和“ DETAIL”的值的列表。 然后,您将拥有一个ID唯一的新数据框。借助此数据框,您可以创建一系列包含True / False的结果,以回答您的过滤器要求。

然后,您可以使用numpy计算该系列中“ True”的总和。