如何在pandas数据帧中添加补充区间

时间:2017-06-07 13:38:29

标签: python pandas dataframe

假设我有signal 100个样本L=100

在这个信号中,我发现了一些标记为" OK"的间隔。间隔存储在Pandas DataFrame中,如下所示:

c = pd.DataFrame(np.array([[10,26],[50,84]]),columns=['Start','End'])
c['Value']='OK'

如何在另一个数据框中添加互补区间以便具有类似的内容

 d = pd.DataFrame(np.array([[0,9],[10,26],[27,49],[50,84],[85,100]]),columns=['Start','End'])
 d['Value']=['Check','OK','Check','OK','Check']

2 个答案:

答案 0 :(得分:2)

我认为你需要:

d = pd.merge(d, c, how='left')
d['Value'] = d['Value'].fillna('Check')
print (d)
   Start  End  Value
0      0    9  Check
1     10   26     OK
2     27   49  Check
3     50   84     OK
4     85  100  Check

编辑:

您可以将numpy.concatenatenumpy.sortnumpy.column_stackDataFrame构造函数一起用于新df。最后需要merge fillna dict作为替换列

s = np.sort(np.concatenate([[0], c['Start'].values, c['End'].values + 1]))
e = np.sort(np.concatenate([c['Start'].values - 1, c['End'].values, [100]]))
d =  pd.DataFrame(np.column_stack([s,e]), columns=['Start','End'])
d = pd.merge(d, c, how='left').fillna({'Value':'Check'})
print (d)
   Start  End  Value
0      0    9  Check
1     10   26     OK
2     27   49  Check
3     50   84     OK
4     85  100  Check

EDIT1:

对于dloc添加了新值,stackshift重新转换为Series。最后通过unstack创建df

b = c.copy()
max_val = 100
min_val = 0
c.loc[-1, 'Start'] = max_val + 1
a = c[['Start','End']].stack(dropna=False).shift().fillna(min_val - 1).astype(int).unstack()
a['Start'] = a['Start'] + 1
a['End'] = a['End'] - 1
a['Value'] = 'Check'
print (a)
    Start  End  Value
 0      0    9  Check
 1     27   49  Check
-1     85  100  Check

d = pd.concat([b, a]).sort_values('Start').reset_index(drop=True)
print (d)
   Start  End  Value
0      0    9  Check
1     10   26     OK
2     27   49  Check
3     50   84     OK
4     85  100  Check

答案 1 :(得分:2)

您可以使用第一个Dataframe创建第二个,并像建议的@jezrael一样进行合并:

d = pd.DataFrame({"Start":[0] + sorted(pd.concat([c.Start , c.End+1])), "End": sorted(pd.concat([c.Start-1 , c.End]))+[100]} )
d = pd.merge(d, c, how='left')
d['Value'] = d['Value'].fillna('Check')
d = d.reindex_axis(["Start","End","Value"], axis=1)

输出

    Start   End Value
0   0       9   Check
1   10     26   OK
2   27     49   Check
3   50     84   OK
4   85    100   Check