Python 熊猫:重新索引和插值非连续数据

Python 熊猫:重新索引和插值非连续数据,python,pandas,data-cleaning,Python,Pandas,Data Cleaning,我有一个按24小时周期排列的数据集,我正在尝试创建一个数据清理系统,该系统可以处理小时周期可能会从凌晨4点跳到下午3点的情况,例如: DET_SCN DATE HOUR MINUTE COUNT OCCUPANCY DET_FAULT CC_FAULT SUB_STAT D11136 07/01/2014 0 0 0 0 FALSE TRUE FALSE D11136 07/01/2014 1 0 0 0 FALSE TRUE FALSE D11136 07/01/2014 2 0 0 0 FA

我有一个按24小时周期排列的数据集,我正在尝试创建一个数据清理系统,该系统可以处理小时周期可能会从凌晨4点跳到下午3点的情况,例如:

DET_SCN DATE HOUR MINUTE COUNT OCCUPANCY DET_FAULT CC_FAULT SUB_STAT
D11136 07/01/2014 0 0 0 0 FALSE TRUE FALSE
D11136 07/01/2014 1 0 0 0 FALSE TRUE FALSE
D11136 07/01/2014 2 0 0 0 FALSE TRUE FALSE
D11136 07/01/2014 3 0 0 0 FALSE TRUE FALSE
D11136 07/01/2014 4 0 0 0 FALSE TRUE FALSE
D11136 07/01/2014 15 0 0 0 FALSE TRUE FALSE
D11136 07/01/2014 16 0 0 0 FALSE TRUE FALSE
D11136 07/01/2014 17 0 0 0 FALSE TRUE FALSE
D11136 07/01/2014 18 0 0 0 FALSE TRUE FALSE
D11136 07/01/2014 19 0 0 0 FALSE TRUE FALSE
D11136 07/01/2014 20 0 0 0 FALSE TRUE FALSE
D11136 07/01/2014 21 0 0 0 FALSE TRUE FALSE
D11136 07/01/2014 22 0 0 0 FALSE TRUE FALSE
D11136 07/01/2014 23 0 0 0 FALSE TRUE FALSE
我希望数据集插入缺失的行并用NaN填充 到目前为止,在加载我的数据后,我尝试了

dataIn = pd.read_csv(filename, delimiter=',')            
frame = DataFrame(dataIn)

print "Cleaning %s " % filename

siteRef = frame['DET_SCN'].str.extract('(D\d{4})').apply(Series,1).stack()
armRef = frame['DET_SCN'].str.extract('(\d{1}$)').apply(Series,1).stack()

armRef.index = armRef.index.droplevel(-1)
siteRef.index = siteRef.index.droplevel(-1)

#append column names
siteRef.name= 'SITE_REF'
armRef.name = 'ARM_REF'

print "printing siteRef"
print siteRef
print "printing armRef"
print armRef

#frame.join(siteRef,armRef columns['SITE_REF','ARM_REF'])
cleanframe = pd.concat([siteRef,armRef,frame], axis=1)             

cleanframe.set_index('HOUR').reindex_axis([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23],axis=1).head()
cleanframe.HOUR = cleanframe.HOUR.interpolate('linear')
但这对我不起作用。我不确定我做错了什么。我试着查看stackoverflow上的其他答案,但没有找到答案

提前谢谢你的帮助

编辑:cleanframe头部如下所示

     0 CC_FAULT  COUNT DATE DET_FAULT DET_SCN  HOUR  MINUTE  OCCUPANCY  \
0  D1113      NaN    NaN  NaN       NaN     NaN   NaN     NaN        NaN   
1  D1113      NaN    NaN  NaN       NaN     NaN   NaN     NaN        NaN   
2  D1113      NaN    NaN  NaN       NaN     NaN   NaN     NaN        NaN   
3  D1113      NaN    NaN  NaN       NaN     NaN   NaN     NaN        NaN   
4  D1113      NaN    NaN  NaN       NaN     NaN   NaN     NaN        NaN   

  SUB_STAT  
0      NaN  
1      NaN  
2      NaN  
3      NaN  
4      NaN  
和cleanframe信息

<class 'pandas.core.frame.DataFrame'>
Int64Index: 37227 entries, 0 to 12408
Data columns (total 10 columns):
0            24818 non-null object
CC_FAULT     12409 non-null object
COUNT        12409 non-null float64
DATE         12409 non-null object
DET_FAULT    12409 non-null object
DET_SCN      12409 non-null object
HOUR         12409 non-null float64
MINUTE       12409 non-null float64
OCCUPANCY    12409 non-null float64
SUB_STAT     12409 non-null object
dtypes: float64(4), object(6)None

以下内容对我来说很有用,我更改的第一件事是axis参数,它应该是axis=0或删除,因为这是默认值。 然后,我重置索引并重命名它以恢复“HOUR”列,并执行interpolation:

In [37]:

df = df.set_index('HOUR').reindex_axis([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23])
df.reset_index(inplace=True)
df.rename(columns={'index':'HOUR'}, inplace=True)
df['HOUR'] = df.HOUR.interpolate('linear')
df
Out[37]:
    HOUR DET_SCN        DATE  MINUTE  COUNT  OCCUPANCY DET_FAULT CC_FAULT  \
0      0  D11136  07/01/2014       0      0          0     False     True   
1      1  D11136  07/01/2014       0      0          0     False     True   
2      2  D11136  07/01/2014       0      0          0     False     True   
3      3  D11136  07/01/2014       0      0          0     False     True   
4      4  D11136  07/01/2014       0      0          0     False     True   
5      5     NaN         NaN     NaN    NaN        NaN       NaN      NaN   
6      6     NaN         NaN     NaN    NaN        NaN       NaN      NaN   
7      7     NaN         NaN     NaN    NaN        NaN       NaN      NaN   
8      8     NaN         NaN     NaN    NaN        NaN       NaN      NaN   
9      9     NaN         NaN     NaN    NaN        NaN       NaN      NaN   
10    10     NaN         NaN     NaN    NaN        NaN       NaN      NaN   
11    11     NaN         NaN     NaN    NaN        NaN       NaN      NaN   
12    12     NaN         NaN     NaN    NaN        NaN       NaN      NaN   
13    13     NaN         NaN     NaN    NaN        NaN       NaN      NaN   
14    14     NaN         NaN     NaN    NaN        NaN       NaN      NaN   
15    15  D11136  07/01/2014       0      0          0     False     True   
16    16  D11136  07/01/2014       0      0          0     False     True   
17    17  D11136  07/01/2014       0      0          0     False     True   
18    18  D11136  07/01/2014       0      0          0     False     True   
19    19  D11136  07/01/2014       0      0          0     False     True   
20    20  D11136  07/01/2014       0      0          0     False     True   
21    21  D11136  07/01/2014       0      0          0     False     True   
22    22  D11136  07/01/2014       0      0          0     False     True   
23    23  D11136  07/01/2014       0      0          0     False     True   

   SUB_STAT  
0     False  
1     False  
2     False  
3     False  
4     False  
5       NaN  
6       NaN  
7       NaN  
8       NaN  
9       NaN  
10      NaN  
11      NaN  
12      NaN  
13      NaN  
14      NaN  
15    False  
16    False  
17    False  
18    False  
19    False  
20    False  
21    False  
22    False  
23    False 

嗯,现在它告诉我它不能在一个重复的轴上重新编制索引?你能展示一下你的df是什么样子吗?在你的问题中,我导入了你的样本数据,没有指定任何列作为索引,它对我来说工作得很好。对不起,我正在创建这样的数据框:cleanframe=pd.concat[siteRef,armRef,frame],axis=1将代码编辑到您的问题中,否则会对其他人隐藏此建议感谢您能否发布cleanframe.head的外观以及cleanframe.infoedited的问题主体以包含此内容。您的代码siteRef.name='SITE_REF'有点令人费解,而另一个代码则不符合您的想法,要重命名列调用rename,您所做的是向名为name的数据帧添加一个属性。concat的结果也很奇怪,它显示0的行数是其他行数的两倍,我认为您需要进行更多的调试,看看哪里出了问题,每次查看一个代码操作,打印每个阶段的形状和头部,直到您确信没有错误来解释:我当时想做的是将DET_SCN拆分为两个系列对象,然后我将其命名为SITE_REF和ARM_REF,然后将这些系列对象浓缩到数据框中,然后在重新索引后删除DET_SCN-我认为0的结果是因为我在命名两个系列对象之前将cleanframe.head和cleanframe.info复制到了错误的位置:我认为您需要返回并一步一步地查看此内容,目前有太多未知和不正确的内容,以便简洁地回答此问题