python-用熊猫将数据分组为单独的批次

我正在尝试创建一个函数,该函数在DataFrame上添加一列,该列为一组时间数据创建批号.我假设一旦水平低于/高于1000,我们便清空(然后重新填充)该批次,因此它是新批次.这意味着我可以按批号将数据分组以进行进一步分析.

我的数据看起来像

df_test = pd.DataFrame(
{ 'Time'  : [1300, 1400, 1500, 1600, 1700, 1800],
  'Level' : [ 200, 1300, 1500,  200, 1500, 1400],
  'Data'  : range(6) })

   Data  Level  Time
0     0    200  1300
1     1   1300  1400
2     2   1500  1500
3     3    200  1600
4     4   1500  1700
5     5   1400  1800

我希望它看起来像是:

   Batch  Data  Level  Time
0    NaN     0    200  1300
1      1     1   1300  1400
2      1     2   1500  1500
3    NaN     3    200  1600
4      2     4   1500  1700
5      2     5   1400  1800

我不担心批次之间的批次号会发生什么. NaN似乎是一个明智的选择,但任何单独和不同的东西.

到目前为止,我已经尝试过:

df['inUse'] = df['Level'] > 1000

然后尝试计算出如何对一列进行编号,并为每个正确的数字开始一个新的数字,但无法确定如何进行.任何帮助,将不胜感激!谢谢.

编辑

尝试过:

df['Batch'] = (df['Level'] < 1000).cumsum()

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\alarr\Python\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\pandas\core\series.py", line 1662, in cumsum
    np.putmask(result, mask, pa.NA)
ValueError: cannot convert float NaN to integer

还使用python 2.7.5和pandas 0.12.0.同样值得一提的是,我想将其应用于不超过一百万行的数据集.忘了提这个!

解决了:

我在主要数据集中尝试了两个答案,并且都有效!谢谢.出于好奇,我对两者同时计时,cumsum方法运行了0.016s,而计数器运行了0.156s.有趣的是看到两者之间的区别!

解决方法:

这适用于0.13或更高版本的pandas:

import pandas as pd
df = pd.DataFrame({ 'Time'  : [1300, 1400, 1500, 1600, 1700, 1800],
                    'Level' : [ 200, 1300, 1500,  200, 1500, 1400],
                    'Data'  : range(6) })
df['Batch'] = (df['Level'] < 1000).cumsum()
print(df)

产量

   Data  Level  Time  Batch
0     0    200  1300      1
1     1   1300  1400      1
2     2   1500  1500      1
3     3    200  1600      2
4     4   1500  1700      2
5     5   1400  1800      2

如果您希望在批次之间使用NaN,则可以改为:

import pandas as pd
import numpy as np
df = pd.DataFrame({ 'Time'  : [1300, 1400, 1500, 1600, 1700, 1800],
                    'Level' : [ 200, 1300, 1500,  200, 1500, 1400],
                    'Data'  : range(6) })

mask = df['Level'] < 1000
df['Batch'] = mask.cumsum()
df.ix[mask, 'Batch'] = np.nan
print(df)

产生

   Data  Level  Time  Batch
0     0    200  1300    NaN
1     1   1300  1400      1
2     2   1500  1500      1
3     3    200  1600    NaN
4     4   1500  1700      2
5     5   1400  1800      2

编辑:对于0.12或更早版本的Pandas,there was an issue与在布尔系列上使用cumsum有关.这可能是您看到的错误的根源.在这种情况下,请尝试在应用cumsum之前将mask转换为dtype int:

mask = (df['Level'] < 1000)
df['Batch'] = mask.astype('int').cumsum()
df.ix[mask, 'Batch'] = np.nan

相关文章

转载:一文讲述Pandas库的数据读取、数据获取、数据拼接、数...
Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基...
整体流程登录天池在线编程环境导入pandas和xrld操作EXCEL文件...
 一、numpy小结             二、pandas2.1为...
1、时间偏移DateOffset对象DateOffset类似于时间差Timedelta...
1、pandas内置样式空值高亮highlight_null最大最小值高亮背景...