python - 根据连续出现的值对数据帧进行分组

标签 python pandas dataframe

我有一个 pandas 数组,其中有一列为 true 或 false(在下面的示例中标题为“条件”)。我想按连续的 true 或 false 值对数组进行分组。我曾尝试使用 pandas.groupby 但没有成功使用该方法,尽管我认为这是由于我缺乏理解。可以在下面找到数据框的示例:

df = pd.DataFrame(df)
print df
print df
index condition   H  t
0          1  2    1.1
1          1  7    1.5
2          0  1    0.9
3          0  6.5  1.6
4          1  7    1.1
5          1  9    1.8
6          1  22   2.0

理想情况下,程序的输出应该与下面的内容类似。我正在考虑使用某种“分组”方法来更轻松地调用每组结果,但不确定这是否是最佳方法。任何帮助将不胜感激。

index condition   H  t group
0          1  2    1.1  1
1          1  7    1.5  1
2          0  1    0.9  2
3          0  6.5  1.6  2
4          1  7    1.1  3 
5          1  9    1.8  3
6          1  22   2.0  3     

最佳答案

由于您处理的是 0/1,这里有另一种方法,使用 diff + cumsum -

df['group'] = df.condition.diff().abs().cumsum().fillna(0).astype(int) + 1    
df

       condition     H    t  group
index                             
0              1   2.0  1.1      1
1              1   7.0  1.5      1
2              0   1.0  0.9      2
3              0   6.5  1.6      2
4              1   7.0  1.1      3
5              1   9.0  1.8      3
6              1  22.0  2.0      3

如果你不介意 float ,这可以做得更快一些。

df['group'] = df.condition.diff().abs().cumsum() + 1
df.loc[0, 'group'] = 1
df

   index  condition     H    t  group
0      0          1   2.0  1.1    1.0
1      1          1   7.0  1.5    1.0
2      2          0   1.0  0.9    2.0
3      3          0   6.5  1.6    2.0
4      4          1   7.0  1.1    3.0
5      5          1   9.0  1.8    3.0
6      6          1  22.0  2.0    3.0

这是具有 numpy 等价物的版本 -

df['group'] = 1
df.loc[1:, 'group'] = np.cumsum(np.abs(np.diff(df.condition))) + 1
df


       condition     H    t  group
index                             
0              1   2.0  1.1      1
1              1   7.0  1.5      1
2              0   1.0  0.9      2
3              0   6.5  1.6      2
4              1   7.0  1.1      3
5              1   9.0  1.8      3
6              1  22.0  2.0      3

在我的机器上,这是时间 -

df = pd.concat([df] * 100000, ignore_index=True)

%timeit df['group'] = df.condition.diff().abs().cumsum().fillna(0).astype(int) + 1 
10 loops, best of 3: 25.1 ms per loop

%%timeit
df['group'] = df.condition.diff().abs().cumsum() + 1
df.loc[0, 'group'] = 1

10 loops, best of 3: 23.4 ms per loop

%%timeit
df['group'] = 1
df.loc[1:, 'group'] = np.cumsum(np.abs(np.diff(df.condition))) + 1

10 loops, best of 3: 21.4 ms per loop
%timeit df['group'] = df['condition'].ne(df['condition'].shift()).cumsum()
100 loops, best of 3: 15.8 ms per loop

关于python - 根据连续出现的值对数据帧进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47767461/

相关文章:

dataframe - 根据共享值将一列从一个数据帧添加到另一个数据帧

python - 如何在 pandas 数据框列中查找累积乘积

python - 如何在Python中比较两个不同.csv文件中的列?

python - 将嵌套在两个字典下的列表转换为 DataFrame

python - 如何修改QT设计器生成的现有PlotWidget的viewbox?

python - Django ModelAdmin能否在 "add"和 "change"页面显示外键字段?

python - 计算 pandas 数据框中的加权平均值

python - 如何在Python中的数据框中将特定位置的行插入?

python - 在 Web App 中设置 Bokeh 图的绝对屏幕位置

python - psutil.WindowsService.username() 返回空白