2016-02-04 102 views
0

我有一个数据帧熊猫DF迭代通过数据帧

name e_count e_start e_end 

aaaa 3  13,14,15, 18,20,25, 

bbbb 2  90,94,  100,102, 

e_count描述e_starte_end元件的数量。我想创建一个新的数据框,添加一列e_end-e_start。例如

name e_count e_start e_end  e_end-e_start 

aaaa 3  13,14,15, 18,20,25, 5,6,10, 

bbbb 2  90,94,  100,102, 10,8, 

我试过如下:

df['e_end-e_start'] = "" 
new_frame = pd.DataFrame(columns = df.columns) 
new_frame['e_end-e_start'] = "" 
new_frame_idx = -1 
for idx,row in df.iterrows(): 
      new_frame_idx = new_frame_idx + 1 
      new_row = df.ix[idx] 
      new_frame = new_frame.append(new_row,ignore_index = True)  
      df.ix[idx,'e_end-e_start'] =df.ix[idx,'e_end']-df.ix[idx,'target_end'] 
      new_frame.ix[new_frame_idx,'e_end-e_start'] =df.ix[idx,'e_end-e_start'] =df.ix[idx,'e_end']-df.ix[idx,'target_end'] 
print new_frame 

但我得到一个错误。你能帮我吗?

回答

0

通常,您将获得更好的性能存储您的数据作为整数,而不是由逗号分隔的数字字符串 。一种平坦的长格式,如

In [73]: df 
Out[73]: 
    name e_start e_end 
0 aaaa  13  18 
0 aaaa  14  20 
0 aaaa  15  25 
1 bbb  90 100 
1 bbb  94 102 

使计算更容易。这里是你如何可以将数据帧转换为 平格式:

然后,计算出的差异,你可以使用

df['diff'] = df['e_end'] - df['e_start'] 

转换回逗号分隔的字符串,

In [76]: df.groupby('name').agg(lambda x: ','.join(x.astype(str))) 
Out[76]: 
     e_start  e_end diff 
name        
aaaa 13,14,15 18,20,25 5,6,10 
bbb  90,94 100,102 10,8 
+0

我的原始数据框还有其他一些列,如'feature':['ccc','ccc']等等(为了简单起见,我在原始问题中忽略了这一点)。如果我使用df = pd.concat([df [['name']]] + dfs,axis = 1),其他列不会出现。你能告诉我如何获得原始数据框的所有列吗?我喜欢最后的表是在格式名称特征e_start e_end 0 AAAA CCC 13 18 0 AAAA CCC 14 20 0 AAAA CCC 15 25 1 BBB CCC 90 100 1 BBB CCC 94 102 – Ssank