Python 如果满足一定条件,如何翻转柱

Python 如果满足一定条件,如何翻转柱,python,pandas,Python,Pandas,我有一个关于熊猫的问题。 假设我有下表 | condition | value | |-----------|--------| | Yes | 0 | |-----------|--------| | Yes | 1 | |-----------|--------| | Yes | 2 | |-----------|--------| | Yes | 3 | |-----------|--------|

我有一个关于熊猫的问题。 假设我有下表

| condition |  value |
|-----------|--------|
| Yes       |  0     |
|-----------|--------|
| Yes       |  1     |
|-----------|--------|
| Yes       |  2     |
|-----------|--------|
| Yes       |  3     |
|-----------|--------|
| Yes       |  4     |
|-----------|--------|
| No        |  0     |
|-----------|--------|
| Yes       |  4     |
|-----------|--------|
| Yes       |  5     |
|-----------|--------|
| Yes       |  6     |
|-----------|--------|
| No        |  0     |
|-----------|--------|
我想得到如下的东西

| condition |  value |
|-----------|--------|
| Yes       |  4     |
|-----------|--------|
| Yes       |  3     |
|-----------|--------|
| Yes       |  2     |
|-----------|--------|
| Yes       |  1     |
|-----------|--------|
| Yes       |  0     |
|-----------|--------|
| No        |        |
|-----------|--------|
| Yes       |  2     |
|-----------|--------|
| Yes       |  1     |
|-----------|--------|
| Yes       |  0     |
|-----------|--------|
| No        |        |
|-----------|--------|
对于这一点,我认为我可以进行循环以获得如下结果:

continue_condition = False
for index, row in df.iterrows():
    if row['condition'] == 'Yes': 
       if not continue_condition:
           continue_condition = True
           min_value = row['value']

    else:
       continue_condition = False
       max_value = row['value']
       start_point = max_value - min_value
       point_value = 0
       while point_value <= start_point:
           df.loc[index-point_value, "new_value"] = point_value
           point_value += 1
        min_value = None
        max_value = None
        point_value = None
continue\u条件=False
对于索引,df.iterrows()中的行:
如果行['condition']='Yes':
如果不符合以下条件:
继续\u条件=真
最小值=行['value']
其他:
continue\u condition=False
最大值=行['value']
起始点=最大值-最小值
点_值=0

当点_值时,这是一种解决方案:

 condition = [('Yes',0),('Yes',1), ('Yes',2), ('Yes',3),('Yes',4),('No',0),('Yes',4),('Yes',5),('Yes',6),('No',0)]

 df = pd.DataFrame(condition,columns=['condition','value'])
“翻转”阵列

(pd
 .DataFrame(np.flip(df.to_numpy(),1), 
            columns=['value','condition'])

 #create helper columns 

 .assign(check = lambda x: x.value.diff(-1),
         temp = lambda x: np.where(x.check.abs() > 1, 
                                   x.check.abs(),np.nan)
        )
 .assign(temp = lambda x: x.temp.fillna(method = 'bfill'),
         value = lambda x: np.where(x.condition=="Yes",
                                    x.value.sub(x.temp).abs(),"")
         )
 .filter(['condition','value'])
  )


  condition value
0   Yes 4
1   Yes 3
2   Yes 2
3   Yes 1
4   Yes 0
5   No  
6   Yes 2
7   Yes 1
8   Yes 0
9   No  

你能解释一下逻辑吗?运行代码并不能给出预期的输出,我在索引5处得到一列
nan
,其中
0.0