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