首页 > 解决方案 > 根据列条件过滤几乎重复的数据

问题描述

我有一个熊猫数据框,这是一个例子:

names  subject     date       marks
A        X      15-05-2021     10
A        X      22-05-2021     12
A        X      29-05-2021     11
A        Y      15-05-2021     15
A        Y      22-05-2021     10
B        P      22-05-2021     17
B        P      29-05-2021     16
B        Q      29-05-2021     14
B        R      22-05-2021     16

我需要过滤掉“2021 年 5 月 29 日”数据可用的所有姓名、日期和主题。

这就是我需要的:

names  subject     date       marks
A        X      15-05-2021     10
A        X      22-05-2021     12
A        X      29-05-2021     11
B        P      22-05-2021     17
B        P      29-05-2021     16
B        Q      29-05-2021     14

我已经想出了如何做到这一点,但我认为它可以改进。

这就是我现在正在做的事情:

df = pd.read_excel("",name="sheet")
end_date = "29-05-2021"
end_date = pd.to_datetime(end_date)
mask = df["date"] == end_date
temp_df = df.loc[mask]
temp_df = temp_df[["names","subject"]]
result_df = pd.merge(df,temp_df, on = ["names","subject"],how="right"]

有没有改进的余地?

标签: pythonpandasdataframe

解决方案


我认为性能是您的解决方案很好,使用 remove 有点简化on(因为通过列名称的交叉连接,here name, subject)并且需要内部连接,这是默认的,所以也应该省略:

end_date = "29-05-2021"

mask = df["date"] == pd.to_datetime(end_date)
result_df = pd.merge(df,df.loc[mask, ["names","subject"]])
print (result_df)
  names subject       date  marks
0     A       X 2021-05-15     10
1     A       X 2021-05-22     12
2     A       X 2021-05-29     11
3     B       P 2021-05-22     17
4     B       P 2021-05-29     16
5     B       Q 2021-05-29     14

GroupBy.transform如果 s 大,替代解决方案会慢一些DataFrame

end_date = "29-05-2021"

mask = df["date"] == pd.to_datetime(end_date)
df = df[df.assign(m = mask).groupby(['names','subject'])['m'].transform('any')]

推荐阅读