Python 熊猫:重新索引和插值非连续数据
我有一个按24小时周期排列的数据集,我正在尝试创建一个数据清理系统,该系统可以处理小时周期可能会从凌晨4点跳到下午3点的情况,例如: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
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复制到了错误的位置:我认为您需要返回并一步一步地查看此内容,目前有太多未知和不正确的内容,以便简洁地回答此问题