如何检查Pandas同组内某列指定行值并返回统一结果?
分组检查指定末尾行并标记整组结果
原始代码
import pandas as pd data = {'Group': ['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '2', '2', '3', '3', '3', '3', '3', '3', '4', '4', '4', '4', '4', '4',], 'Test1': ['ABC', 'CDE', 'EFG', 'GHI', 'IJK', 'KLM', 'MNO', 'OPQ', 'QRS', 'STU', 'UVW', 'WXYZ', 'ABC', 'CDE', 'EFG', 'GHI', 'IJK', 'KLM', 'MNO', 'OPQ', 'QRS', 'STU', 'UVW', 'WXYZ',], 'Test2': ['1234','4567', '8910', '1112', '1314', '1415', '1516', '1718', '1920', '2122', '2324', '2526', '2728', '2930', '3132', '3334', '3536', '3738', '2940', '4142', '4344', '4546', '4748', '4950'], 'Value': [True, True, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, False, True, True, True, False, True, True,], } df = pd.DataFrame(data) print(df)
需求说明
针对每个Group分组,检查其最后2、3或4行的Value列值:
- 若这些行中存在
False,则该组所有行返回False - 若这些行全为
True,则该组所有行返回True
以检查最后3行为例,预期输出如下:
Group | Value ----- | ----- 1 | False 1 | False 1 | False 2 | True 2 | True 2 | True 3 | False 3 | False 3 | False 4 | False 4 | False 4 | False
解决方案
可以通过groupby结合tail()和all()实现需求,代码如下:
def check_group_tail(df, n): # 计算每个分组最后n行Value是否全为True group_status = df.groupby('Group')['Value'].apply(lambda x: x.tail(n).all()) # 将分组结果映射回原数据的每一行 df['Value'] = df['Group'].map(group_status) return df[['Group', 'Value']] # 检查最后3行的情况 result = check_group_tail(df, 3) print(result.to_string(index=False))
代码解释
x.tail(n):提取每个分组的最后n行数据.all():判断这些行的Value是否全部为True,只要有一个False就返回Falsedf['Group'].map(group_status):将每个分组的判断结果对应到原DataFrame的每一行
如果需要检查最后2行或4行,只需修改函数的第二个参数n即可,比如调用check_group_tail(df, 2)或check_group_tail(df, 4)。
内容的提问来源于stack exchange,提问作者Bad Coder
相关产品推荐
相关产品推荐

