Pandas:基于条件的数据帧丢弃数据

2024-09-30 22:22:50 发布

您现在位置:Python中文网/ 问答频道 /正文

有一个带有列名称和主题的值的df

name  subject

mark   social  
mark   social
mark   maths
mark   social
mark   maths
mark   social
mark   social
mark   social
mark   social
mark   social
mark   maths
mark   social
mark   social
mark   social
mark   maths
mark   social
mark   social
mark   social
mark   social
mark   social
mark   social
mark   social
mark   math

如果科目的顺序是社会、社会、数学。需要删除第一个社交网站。即使在数学之前有多个社会问题。需要去除社会性,社会性,数学

name subject mark social mark social mark maths mark social mark maths mark social mark social mark social mark social mark social mark maths mark social mark social mark social mark maths mark social mark social mark social mark social mark social mark social mark social mark maths


Tags: name名称df主题顺序social数学math
2条回答

在样本的最后一行,您有“数学”。我想应该是“数学”吧。然后你可以做:

df.loc[~(
    (df['subject'] == 'social')
    & (df['subject'].shift(-1) == 'social')
    & (df['subject'].shift(-2) == 'maths'))
]

我们用df.loc选择要删除的行,并在开始处添加否定符号——因此,当主题为“社交”且下面有“社交”和“数学”两个位置时,每种情况都是如此。在本例中,我们删除第0、8、12和20行

另一个解决方案:

df["tmp"] = df["subject"].str.contains("math") + (
    df["subject"].str.contains("social") * 2
)
df["tmp"] = (
    df.groupby("name")
    .rolling(3)["tmp"]
    .apply(lambda x: x.eq([2, 2, 1]).all())
    .values
)
df["tmp"] = df.groupby("name")["tmp"].transform(lambda x: x.shift(-2))
print(df[df["tmp"] != 1].drop(columns=["tmp"]))

印刷品:

    name subject
1   mark  social
2   mark   maths
3   mark  social
4   mark   maths
5   mark  social
6   mark  social
7   mark  social
9   mark  social
10  mark   maths
11  mark  social
13  mark  social
14  mark   maths
15  mark  social
16  mark  social
17  mark  social
18  mark  social
19  mark  social
21  mark  social
22  mark    math

相关问题 更多 >