我是熊猫的新手,我需要你的帮助。我有这个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