python - 以间隔对包含 np.nan 的值进行分组

标签 python pandas numpy nan

我有一个包含零、一和 np.nan 的 pandas 系列:

import pandas as pd
import numpy as np
df1 = pd.Series([ 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, np.nan, np.nan, 1])
df1
Out[6]: 
0     0.0
1     0.0
2     0.0
3     0.0
4     0.0
5     1.0
6     1.0
7     1.0
8     0.0
9     0.0
10    0.0
11    NaN
12    NaN
13    1.0
dtype: float64

我想创建一个数据帧 df2,其中包含具有相同值的间隔的开始和结束,以及关联的值...在这种情况下 df2 应该是...

df2
Out[5]: 
   Start     End  Value
0      0  4         0
1      5  7         1
2      8  10        0
3      11 12        NaN
4      13 13        1

遵循解决方案here :

s = df1.ne(df1.shift()).cumsum()
df2 = df1.groupby(s).apply(lambda x: pd.Series([x.index[0], x.index[-1], x.iat[0]], 
                                                index=['Start','End','Value']))
                   .unstack().reset_index(drop=True)

但它不适用于这种情况

df2
Out[11]: 
   Start   End  Value
0    0.0   4.0    0.0
1    5.0   7.0    1.0
2    8.0  10.0    0.0
3   11.0  11.0    NaN
4   12.0  12.0    NaN
5   13.0  13.0    1.0

最佳答案

NaN 在相等性检查方面存在问题。您可以解决这个问题,暂时用一个不起眼的值填充它。

In [361]: s = df1.fillna('-dummy-').ne(df1.fillna('-dummy-').shift()).cumsum()

In [362]: df1.groupby(s).apply(lambda x: pd.Series([x.index[0], x.index[-1], x.iat[0]],
     ...:                                           index=['Start','End','Value']))
     ...:          .unstack().reset_index(drop=True)
Out[362]:
   Start   End  Value
0    0.0   4.0    0.0
1    5.0   7.0    1.0
2    8.0  10.0    0.0
3   11.0  12.0    NaN
4   13.0  13.0    1.0

关于python - 以间隔对包含 np.nan 的值进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44822495/

相关文章:

python - 将分组后的列的多个值合并到python pandas中的一列中

python - 根据另一个数组的值从一个数组中提取值的函数

python - 诊断和提高计算速度

python - 无法在赋值表达式中设置字段值

python - Celery - 内存泄漏(即使工作人员完成任务后内存也不会释放)

python - 如何替换数据框中的 Year 并在 Pandas 中将该值乘以 12

python - 绘制包含大量数据点的时间序列 matplotlib

Python - 计算 word2vec 向量的层次聚类并将结果绘制为树状图

python - 如何创建一个 python 脚本,以便在目录中的 csv 文件在过去 24 小时内未更新时发送电子邮件?

python - 使用 Python pathlib 处理非 UTF-8 Posix 文件名?