![](/img/trans.png)
[英]Pandas Data frame counting how many times certain value appears in column if and only if other columns meet certain condition
[英]How to flip column if certain condition is meet pandas
我有关于熊猫的问题。 让我们假设我有下表
| 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
但是,这是慢代码,只是想知道如何加快代码速度?
这是一种解决方案:
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'])
numpy flip '翻转' 数组
(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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.