pandas如何使用str.match组修改行



我是熊猫的新手,我需要你的帮助。我有这个df,我想用这种方式修改'Dig'列的内容:

挖桌子

10,和7 INTCH1

260,和4 INTCH2

基本上我想做的是将字符串10&&-7分成两部分(10和7),从第一个元素开始,删除最后一个字符(例如从10中删除0)并添加'1',直到达到值7。

所以第一行应该变成:

10 INTCH1

11 INTCH1

12 INTCH1

13 INTCH1

14 INTCH1

15 INTCH1

16 INTCH1

17 INTCH1

我用python完成了它,这是从我的代码中提取的一个例子:

elif re_dig3.match(cur_line):                                       
matched = re_dig3.match(cur_line)
int1 = matched.group(1)
int2 = matched.group(2)
int11, int22 = int(int1[-1]), int(int2[-1])
while int11 <= int22:
file_writing(new_file, (int1[:-1]+str(int11)) + 'n')
int11 += 1
dict_list['list_dig3'].append(cur_line)

,我定义了两个组(int1和int2),取最后一个字符,将类型改为int,并创建一个while循环,在此循环中我将所需的结果写入文件。

我希望使用pandas来获得这个结果,因为我认为它比python循环更快。

我从前面的df中得到了一个新的df,它有两个列,两个正则表达式组('0'和'1'):

df2intreg['Dig'].str.extract(r'(d+)&&-(d+)$')

0 1

10 7

但是现在我不知道该怎么做了,任何提示都非常感谢。

谢谢,大卫。

这个想法是解析Dig,创建一个由'Dig'定义的整数列表,将它们粘贴到每一行的列表中,然后explode

首先,加载样例数据
import pandas as pd
from io import StringIO
data = StringIO(
"""
Dig Dest
10&&-7 INTCH1
260&&-4 INTCH2
""")
df = pd.read_csv(data, delim_whitespace=True)

接下来,使用str.split()解析'Dig',并将它们分成单独的列

df[['start','num']] = df['Dig'].str.split('&&-').values.tolist()
df[['start','num']] = df[['start','num']].astype(int)

我们

Dig     Dest    start   num
0   10&&-7  INTCH1  10      7
1   260&&-4 INTCH2  260     4

现在我们创建一个每行整数的列表

import numpy as np
df['elements'] = df.apply(lambda row: row['start'] + np.arange(row['num']+1), axis=1)
获取'elements'列中的列表:
Dig     Dest    start   num elements
0   10&&-7  INTCH1  10      7   [10, 11, 12, 13, 14, 15, 16, 17]
1   260&&-4 INTCH2  260     4   [260, 261, 262, 263, 264]

最后,展开并选择我们关心的列

df.explode('elements')[['elements','Dest']]

获得

elements Dest
0   10  INTCH1
0   11  INTCH1
0   12  INTCH1
0   13  INTCH1
0   14  INTCH1
0   15  INTCH1
0   16  INTCH1
0   17  INTCH1
1   260 INTCH2
1   261 INTCH2
1   262 INTCH2
1   263 INTCH2
1   264 INTCH2
编辑:使用RegEx代替分割

如果'Dig'中的值与问题中的格式不一致,则可以在第一步中使用正则表达式,如下所示。首先,加载数据

import pandas as pd
from io import StringIO
data = StringIO(
"""
Dig Dest
10&&-7 INTCH1
260&&-4 INTCH2
211&&-3&-6&-8 INTCH3
""")
df = pd.read_csv(data, delim_whitespace=True)

然后从'Dig'的每个元素中提取前两个数字:

df[['start','num']] = df['Dig'].str.findall('d+').apply(lambda l: l[:2]).values.tolist()
df

我们


Dig             Dest    start   num
0   10&&-7          INTCH1  10      7
1   260&&-4         INTCH2  260     4
2   211&&-3&-6&-8   INTCH3  211     3

最新更新