获取单元格值并填充python中新列的行

获取单元格值并填充python中新列的行,python,pandas,Python,Pandas,我有如下数据: Col1 time: 4 1 2 3 time: 7 4 5 6 time: 11 7 8 ... Col1 Col2 time: 4 4 1 4 2 4 3 4 time: 7 7 4 7 5 7 6 7 time: 11 11 7 11 8 11 ... ... 我想添加一个新列,使其看起来像这样: Col1 t

我有如下数据:

Col1
time: 4
1
2
3
time: 7
4
5
6
time: 11
7 
8
...
Col1      Col2
time: 4   4
1         4
2         4
3         4
time: 7   7
4         7
5         7
6         7
time: 11  11
7         11
8         11
...       ...
我想添加一个新列,使其看起来像这样:

Col1
time: 4
1
2
3
time: 7
4
5
6
time: 11
7 
8
...
Col1      Col2
time: 4   4
1         4
2         4
3         4
time: 7   7
4         7
5         7
6         7
time: 11  11
7         11
8         11
...       ...
因此,我想从“time:x”行中获取特定值,并将它们放在新列的行中,直到出现下一行“time:x”。有什么建议吗?我甚至不太确定行中的值是整数还是字符串。
我感谢你的帮助

您可以尝试以下方法:

df['Col2']=(df.groupby(df['Col1'].str.contains('time:').cumsum())['Col1'].transform('first')
        .str.split(':').str[-1])
print(df)

说明:

首先,我们创建一个helper系列,该系列为所有具有单词
time
的行返回True,然后对它们进行累积求和:

print(df['Col1'].str.contains('time:').cumsum())

0     1
1     1
2     1
3     1
4     2
5     2
6     2
7     2
8     3
9     3
10    3
现在,我们可以将其视为单独的组,因此我们在此帮助器系列上进行groupby并返回第一个值:

print(df.groupby(df['Col1'].str.contains('time:').cumsum())['Col1'].transform('first'))

0      time: 4
1      time: 4
2      time: 4
3      time: 4
4      time: 7
5      time: 7
6      time: 7
7      time: 7
8     time: 11
9     time: 11
10    time: 11
一旦我们得到这个结果,我们就可以链接
str.split
,它在
上拆分序列:
,并使用
.str[-1]
返回拆分的最后一个元素

希望能有所帮助。

我的两分钱:

import pandas as pd
import re

df = pd.read_csv('dummy_data.csv')
print(df)
df['Col2'] = ''
fill_value = 0
regex_pattern = r'time: (\d+)'
for index, row in df.iterrows():
    if len(re.findall(regex_pattern, row['Col1'])) == 1:
        fill_value = int(re.findall(regex_pattern, row['Col1'])[0])
    row['Col2'] = fill_value
df
输出:

        Col1
0    time: 4
1          1
2          2
3          3
4    time: 7
5          4
6          5
7          6
8   time: 11
9          7
10         8
        Col1 Col2
0    time: 4    4
1          1    4
2          2    4
3          3    4
4    time: 7    7
5          4    7
6          5    7
7          6    7
8   time: 11   11
9          7   11
10         8   11

您可以使用一个正则表达式,在断言后面有一个积极的外观。它的意思是,如果字符串“time:”后面跟着一个数字,则将其提取出来。之后,向前填充以获得您的结果:

 (df
  .assign(Col2 = lambda x: x.Col1.str.extract(r'((?<=time: )\d+)'))
  .ffill()
  )

     Col1      Col2
0   time: 4     4
1   1           4
2   2           4
3   3           4
4   time: 7     7
5   4           7
6   5           7
7   6           7
8   time: 11    11
9   7           11
10  8           11
(df

.assign(Col2=lambda x:x.Col1.str.extract(r')(?这同样非常有效。如果您能抽出时间用一些词解释代码中发生了什么,我将非常感激,这样我就可以学习了。我得到了一些信息,但不是所有信息。太棒了!非常感谢。@Jailbone我已经添加了一个解释,希望对您有所帮助。谢谢