Python 对于数据帧,按变量分组,排序,然后消除非连续行
我有以下数据帧: 类别 价值 身份证件 汽车 宝马 1. 汽车 河流浅水处 9 汽车 梅赛德斯 2. 汽车 保时捷 3. 汽车 转基因的 16 汽车 特斯拉 19 周期 3T 3. 周期 比安奇 19 周期 炼金术 4. 周期 安切 5. 周期 卡纳代尔 16 周期 科尔纳戈 22Python 对于数据帧,按变量分组,排序,然后消除非连续行,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下数据帧: 类别 价值 身份证件 汽车 宝马 1. 汽车 河流浅水处 9 汽车 梅赛德斯 2. 汽车 保时捷 3. 汽车 转基因的 16 汽车 特斯拉 19 周期 3T 3. 周期 比安奇 19 周期 炼金术 4. 周期 安切 5. 周期 卡纳代尔 16 周期 科尔纳戈 22 尝试此操作,根据类别和id对值进行排序,然后计算每个类别的差异,并仅保留连续值: c = df.sort_values(['category','id']).groupby("category")
尝试此操作,根据类别和id对值进行排序,然后计算每个类别的差异,并仅保留连续值:
c = df.sort_values(['category','id']).groupby("category")['id'].diff().fillna(1).eq(1)
out = df[c.reindex(df.index)]
这看起来可能不是最聪明的解决方案,但它在当前样本数据集和一些稍微修改的数据中都给出了正确的结果:
import numpy as np
df2 = df.sort_values(['category', 'id'])
mask = (df2.groupby("category")['id'].diff().eq(1)
.replace(False, np.nan)
.bfill(limit=1)
.fillna(False))
df2.loc[mask]
在这里,排序之后,我们构建一个布尔掩码,用于选择具有连续数字的行。逻辑是,每当我们通过.diff()
发现一行与前一行存在差异,且此差异等于1时,也应选择前一行(因为它们都是连续的,但此连续条件仅在第二行检测到)。连续状态仅在相同的类别
组中有效
结果:
category value id
0 car bmw 1
2 car mercedes 2
3 car porsche 3
6 cycle 3T 3
8 cycle Alchemy 4
9 cycle Ancheer 5
category value id
2 car mercedes 2
3 car porsche 3
8 cycle Alchemy 4
9 cycle Ancheer 5
将解决方案应用于轻微更改的数据:
现在,让我们修改原始示例数据,如下所示:
- 对于
=Category
将car
=id
更改为1
0
- 对于
=类别
更改周期
=id
为3
2
df
:
category value id
0 car bmw 0
1 car ford 9
2 car mercedes 2
3 car porsche 3
4 car GM 16
5 car tesla 19
6 cycle 3T 2
7 cycle Bianchi 19
8 cycle Alchemy 4
9 cycle Ancheer 5
10 cycle Cannondale 16
11 cycle Colnago 22
在此处应用解决方案后的结果:
category value id
0 car bmw 1
2 car mercedes 2
3 car porsche 3
6 cycle 3T 3
8 cycle Alchemy 4
9 cycle Ancheer 5
category value id
2 car mercedes 2
3 car porsche 3
8 cycle Alchemy 4
9 cycle Ancheer 5
在这里,我们仍然可以得到两组连续的行
您可以比较不同解决方案的结果。@ShubhamSharma谢谢,是的,可以用
loc
:)替换reindex
),让我们知道您是否需要以下解决方案的进一步说明。如果没有,请选择最适合您需要的解决方案。谢谢