我有一个从以下代码生成的数据框:df1
import pandas as pd
import numpy as np
df = pd.DataFrame({'Start': [True, '-', '-', '-', True, '-', '-', '-', True, '-', '-', '-'],
'End': ['-', '-', '-', True, '-', '-', '-', True, '-', '-', '-', True],
'Value': ['-', 15, '-', '-', 109, '-', '-', '-', '-', '-', 13, '-']})
df
| | Start | End | Value |
|-------|-------|-------|-------|
| 0 | True | - | - |
| 1 | - | - | 15 |
| 2 | - | - | - |
| 3 | - | True | - |
| 4 | True | - | 109 |
| 5 | - | - | - |
| 6 | - | - | - |
| 7 | - | True | - |
| 8 | True | - | - |
| 9 | - | - | - |
| 10 | - | - | 13 |
| 11 | - | True | - |
我想向前填充'值'列,直到'结束'列== True的位置,像这样:df2
| | Start | End | Value |
|-------|-------|-------|-------|
| 0 | True | - | - |
| 1 | - | - | 15 |
| 2 | - | - | 15 |
| 3 | - | True | 15 |
| 4 | True | - | 109 |
| 5 | - | - | 109 |
| 6 | - | - | 109 |
| 7 | - | True | 109 |
| 8 | True | - | - |
| 9 | - | - | - |
| 10 | - | - | 13 |
| 11 | - | True | 13 |
任何帮助都会得到高度评价!
PS。抱歉,我的声誉不够高,无法直接发布图片...
答案 0 :(得分:2)
首先,始终避免在列中包含混合类型。显然您有字符串和布尔值-不推荐。
首先,使您的数据框架可行:
df = df.replace('-',np.nan).astype(float)
然后,简单的groupby
+ ffill
s = df.start.eq(1).cumsum()
df['value'] = df.groupby(s).value.ffill()
start end value
0 1.0 NaN NaN
1 NaN NaN 15.0
2 NaN NaN 15.0
3 NaN 1.0 15.0
4 1.0 NaN 109.0
5 NaN NaN 109.0
6 NaN NaN 109.0
7 NaN 1.0 109.0
8 1.0 NaN NaN
9 NaN NaN NaN
10 NaN NaN 13.0
11 NaN 1.0 13.0