2016-09-30 190 views
4

我正在使用熊猫来构造和处理数据。重新采样错误:无法用方法或限制重新索引非唯一索引

我在这里有一个DataFrame的日期作为索引,Id和比特率。 我想通过ID对数据进行分组,并重新采样,同时还要对每个ID相对的时间点进行重新采样,最后保持比特率得分。

例如,给定:

df = pd.DataFrame(
{'Id' : ['CODI126640013.ts', 'CODI126622312.ts'], 
'beginning_time':['2016-07-08 02:17:42', '2016-07-08 02:05:35'], 
'end_time' :['2016-07-08 02:17:55', '2016-07-08 02:26:11'], 
'bitrate': ['3750000', '3750000'], 
'type' : ['vod', 'catchup'], 
'unique_id' : ['f2514f6b-ce7e-4e1a-8f6a-3ac5d524be30', 'f2514f6b-ce7e-4e1a-8f6a-3ac5d524bb22']}) 

这给:

enter image description here

这是我的代码来获取日期的唯一列与每次Id和比特率:

df = df.drop(['type', 'unique_id'], axis=1) 
df.beginning_time = pd.to_datetime(df.beginning_time) 
df.end_time = pd.to_datetime(df.end_time) 
df = pd.melt(df, id_vars=['Id','bitrate'], value_name='dates').drop('variable', axis=1) 
df.set_index('dates', inplace=True) 

其中给出:

enter image description here

现在,重新取样的时间! 这是我的代码:

print (df.groupby('Id').resample('1S').ffill()) 

这是结果:

enter image description here

这正是我想做的事情! 我有38279日志与相同的列,当我做同样的事情时,我有一个错误消息。第一部分完美的作品,并给出了这一点:

enter image description here

的部分(df.groupby( 'ID')重采样( '1')ffill()。)给出了这样的错误消息:

ValueError: cannot reindex a non-unique index with a method or limit 

任何想法? Thnx!

回答

6

似乎有在列beginning_timeend_time重复问题,我试着模拟它:

df = pd.DataFrame(
{'Id' : ['CODI126640013.ts', 'CODI126622312.ts', 'a'], 
'beginning_time':['2016-07-08 02:17:42', '2016-07-08 02:17:42', '2016-07-08 02:17:45'], 
'end_time' :['2016-07-08 02:17:42', '2016-07-08 02:17:42', '2016-07-08 02:17:42'], 
'bitrate': ['3750000', '3750000', '444'], 
'type' : ['vod', 'catchup', 's'], 
'unique_id':['f2514f6b-ce7e-4e1a-8f6a-3ac5d524be30', 'f2514f6b-ce7e-4e1a-8f6a-3ac5d524bb22','w']}) 

print (df) 
       Id  beginning_time bitrate    end_time \ 
0 CODI126640013.ts 2016-07-08 02:17:42 3750000 2016-07-08 02:17:42 
1 CODI126622312.ts 2016-07-08 02:17:42 3750000 2016-07-08 02:17:42 
2     a 2016-07-08 02:17:45  444 2016-07-08 02:17:42 

     type        unique_id 
0  vod f2514f6b-ce7e-4e1a-8f6a-3ac5d524be30 
1 catchup f2514f6b-ce7e-4e1a-8f6a-3ac5d524bb22 
2  s          w 
df = df.drop(['type', 'unique_id'], axis=1) 
df.beginning_time = pd.to_datetime(df.beginning_time) 
df.end_time = pd.to_datetime(df.end_time) 
df = pd.melt(df, id_vars=['Id','bitrate'], value_name='dates').drop('variable', axis=1) 
df.set_index('dates', inplace=True) 


print (df) 
            Id bitrate 
dates           
2016-07-08 02:17:42 CODI126640013.ts 3750000 
2016-07-08 02:17:42 CODI126622312.ts 3750000 
2016-07-08 02:17:45     a  444 
2016-07-08 02:17:42 CODI126640013.ts 3750000 
2016-07-08 02:17:42 CODI126622312.ts 3750000 
2016-07-08 02:17:42     a  444 

print (df.groupby('Id').resample('1S').ffill()) 

ValueError: cannot reindex a non-unique index with a method or limit

一个可能的解决方案是增加drop_duplicates和使用旧wayresamplegroupby

df = df.drop(['type', 'unique_id'], axis=1) 
df.beginning_time = pd.to_datetime(df.beginning_time) 
df.end_time = pd.to_datetime(df.end_time) 
df = pd.melt(df, id_vars=['Id','bitrate'], value_name='dates').drop('variable', axis=1) 

print (df.groupby('Id').apply(lambda x : x.drop_duplicates('dates') 
              .set_index('dates') 
              .resample('1S') 
              .ffill())) 

                Id bitrate 
Id    dates           
CODI126622312.ts 2016-07-08 02:17:42 CODI126622312.ts 3750000 
CODI126640013.ts 2016-07-08 02:17:42 CODI126640013.ts 3750000 
a    2016-07-08 02:17:41     a  444 
       2016-07-08 02:17:42     a  444 
       2016-07-08 02:17:43     a  444 
       2016-07-08 02:17:44     a  444 
       2016-07-08 02:17:45     a  444 

您还可以通过boolean indexing检查重复:

print (df[df.beginning_time == df.end_time]) 
2  s          w 
       Id  beginning_time bitrate    end_time \ 
0 CODI126640013.ts 2016-07-08 02:17:42 3750000 2016-07-08 02:17:42 
1 CODI126622312.ts 2016-07-08 02:17:42 3750000 2016-07-08 02:17:42 

     type        unique_id 
0  vod f2514f6b-ce7e-4e1a-8f6a-3ac5d524be30 
1 catchup f2514f6b-ce7e-4e1a-8f6a-3ac5d524bb22 
+1

jezrael你是我的英雄! – DataAddicted