Python 如何在数据帧中添加互补间隔
假设我有一个100个样本的Python 如何在数据帧中添加互补间隔,python,pandas,dataframe,Python,Pandas,Dataframe,假设我有一个100个样本的信号L=100 在这个信号中,我发现了一些我标记为“OK”的间隔。间隔存储在如下所示的数据帧中: 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
信号L=100
在这个信号中,我发现了一些我标记为“OK”的间隔。间隔存储在如下所示的数据帧中:
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']
我认为你需要:
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
编辑:
您可以对新的df
使用with和DataFrame
构造函数。替换列最后需要使用bydict
:
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
编辑1:
对于d
,由loc
添加了新值,由和重新调整到系列。上次创建df
返回人:
我认为你需要:
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
编辑:
您可以对新的df
使用with和DataFrame
构造函数。替换列最后需要使用bydict
:
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
编辑1:
对于d
,由loc
添加了新值,由和重新调整到系列。上次创建df
返回人:
您可以使用第一个数据帧创建第二个数据帧,然后像建议的@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
您可以使用第一个数据帧创建第二个数据帧,然后像建议的@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
谢谢jezrael,但我的问题是我没有数据帧d,我不知道如何从CHMM开始创建它,那么它就更复杂了。请给我一些时间。谢谢jezrael,但我的问题是我没有数据帧d,我不知道如何从CHMM开始创建它,那么它就更复杂了。请给我一些时间。谢谢,有没有想过先“开始”再“结束”作为专栏?谢谢,有没有想过先“开始”再“结束”作为专栏?