我试图根据每一类行是否包含超过阈值的值来删除与另一行中的值相对应的每一行。虽然我觉得这应该是一个简单的" if“条件语句,但我很困惑这是真的像我想象的那么简单,还是复杂得多。我用的是蟒蛇和熊猫。为了更好地解决这个问题,我将在下面的示例中进行演示。
我有以下数据帧:
Date Category Value
---------------------------------------
2015-06-02 1 2
2015-06-03 1 9
2015-06-04 1 2
2015-06-05 2 2
2015-06-06 2 8
2015-06-07 2 11
2015-06-08 2 2
2015-06-09 4 2
2015-06-10 4 5
2015-06-11 4 12
2015-06-12 4 2
2015-06-13 6 2
2015-06-14 6 8
2015-06-15 6 2
2015-06-16 8 2
2015-06-17 8 6
2015-06-18 8 10
2015-06-19 8 2
如您所见,行通过与"Category“列相对应的特定ID进行分类。所以在这个例子中有5个“类别”:"1","2","4","6","8“。只要类别保持不同,每个类别不增加1也无关紧要。因此,你会看到一个模式,假设这是日期顺序数据,对于每个类别,值从2开始,有一些介于之间的值,不管有多少,到2结束。所以每个类别都有值2。我想要做的是,对于唯一的类别,删除介于2之间的类别,其中没有>= 10的值。正如你所看到的,这将意味着删除类别1(在2之间有一个9),并删除类别6(在2之间有一个8)。当然,在2之间可以有任意数量的值,但其中至少必须有一个是>= 10,因此我希望生成以下数据帧:
Date Category Value
---------------------------------------
2015-06-05 2 2
2015-06-06 2 8
2015-06-07 2 11
2015-06-08 2 2
2015-06-09 4 2
2015-06-10 4 5
2015-06-11 4 12
2015-06-12 4 2
2015-06-16 8 2
2015-06-17 8 6
2015-06-18 8 10
2015-06-19 8 2
在python中如何做到这一点呢?虽然我认为我会写一个条件语句,说“如果df‘value中的值’< 10,那么删除”,但我不确定如何根据我提到的"Category“列来组织它。
发布于 2021-10-27 08:01:23
因为组以2/3
开头/结尾,所以条件df['Value'].ge(10)
已经搜索到了中间的那些行。在这种情况下,您只需要执行groupby().transform('any')
:
mask = df['Value'].ge(10).groupby(df['Category']).transform('any')
df[mask]
输出:
Date Category Value
3 2015-06-05 2 3
4 2015-06-06 2 8
5 2015-06-07 2 11
6 2015-06-08 2 3
7 2015-06-09 4 3
8 2015-06-10 4 5
9 2015-06-11 4 12
10 2015-06-12 4 3
14 2015-06-16 8 3
15 2015-06-17 8 6
16 2015-06-18 8 10
17 2015-06-19 8 3
发布于 2021-10-27 08:22:31
pandas中的groupby
可以用作迭代器,返回子集的数据帧,以便可以在每个子数据帧上执行操作。举个例子:
cats = reduce(lambda x, y: x+y, [[i]*4 for i in range(4)])
vals = [random.randint(0, 20) for _ in range(len(cats))]
df = pd.DataFrame({"category": cats, "values": vals})
此随机数据帧可能如下所示:
然后,您可以迭代并将逻辑专门应用于每个子类别,如下所示:
res = []
for _, sub_df in df.groupby("category"):
if sub_df["values"].max() >= 10:
res.append(sub_df)
if res:
df = pd.concat(res)
此代码查看每个子集,如果满足条件,则将其附加到列表中。然后将此数据帧列表(如果不为空)连接到一个数据帧中。注意:这里的顺序现在将按分组的变量排序。如果这有问题,那么您只需使用df.sort_index()
按原始索引重新排序即可。
https://stackoverflow.com/questions/69741837
复制