微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐