我正在尝试创建一个函数,该函数在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