首页 > 解决方案 > 值和后续行上的子集 df - pandas

问题描述

我知道这是在 S0 的某个地方,但我似乎找不到它。我想对特定值的 df 进行子集化,并包含以下唯一行。使用下面,我可以返回等于 的值A,但我希望返回下一个唯一值,即B.

注意:后续唯一值可能不是B或可能有不同的行,因此我需要一个函数来查找返回所有后续唯一值。

import pandas as pd

df = pd.DataFrame({   
    'Time' : [1,1,1,1,1,1,2,2,2,2,2,2],             
    'ID' : ['A','A','B','B','C','C','A','A','B','B','C','C'],      
    'Val' : [2.0,5.0,2.5,2.0,2.0,1.0,1.0,6.0,4.0,2.0,5.0,1.0],   
    })

df = df[df['ID'] == 'A']

预期输出:

    Time ID  Val
0      1  A  2.0
1      1  A  5.0
2      1  B  2.5
3      1  B  2.0
4      2  A  1.0
5      2  A  6.0
6      2  B  4.0
7      2  B  2.0

标签: pythonpandas

解决方案


好的 OP 让我再做一次,你想找到所有“A”行(基本条件)和所有在某个时间点跟随“A”行的行,对吧?

然后,

is_A = df["ID"] == "A"
not_A_follows_from_A = (df["ID"] != "A") &( df["ID"].shift() == "A")
candidates = df["ID"].loc[is_A | not_A_follows_from_A].unique()
df.loc[df["ID"].isin(candidates)]

应该按预期工作。

编辑:示例

df = pd.DataFrame({
 'Time': [1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1],
 'ID': ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'A', 'E', 'E', 'E', 'A', 'F'],
 'Val': [7, 2, 7, 5, 1, 6, 7, 3, 2, 4, 7, 8, 2]})
is_A = df["ID"] == "A"
not_A_follows_from_A = (df["ID"] != "A") &( df["ID"].shift() == "A")
candidates = df["ID"].loc[is_A | not_A_follows_from_A].unique()
df.loc[df["ID"].isin(candidates)]

输出这个:

    Time ID  Val
0      1  A    7
1      1  A    2
2      1  B    7
3      0  B    5
7      1  A    3
8      0  E    2
9      0  E    4
10     1  E    7
11     1  A    8
12     1  F    2

推荐阅读