我有这样的数据:
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)
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
的行返回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
现在我们可以将其视为单独的组,因此我们在此助手系列上分组,并返回第一个值:
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
您可以使用regex,并带有一个正面的look-behind断言。它的意思是,如果一个数字跟在字符串"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