Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对于数据帧,按变量分组,排序,然后消除非连续行_Python_Pandas_Dataframe - Fatal编程技术网

Python 对于数据帧,按变量分组,排序,然后消除非连续行

Python 对于数据帧,按变量分组,排序,然后消除非连续行,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")

我有以下数据帧:

类别 价值 身份证件 汽车 宝马 1. 汽车 河流浅水处 9 汽车 梅赛德斯 2. 汽车 保时捷 3. 汽车 转基因的 16 汽车 特斯拉 19 周期 3T 3. 周期 比安奇 19 周期 炼金术 4. 周期 安切 5. 周期 卡纳代尔 16 周期 科尔纳戈 22
尝试此操作,根据类别和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
),让我们知道您是否需要以下解决方案的进一步说明。如果没有,请选择最适合您需要的解决方案。谢谢