我的数据框中有以下两列:
COL1 COL2
12 :402:agshhhjd:45:hghghgruru:12:fghg,hgh:22:hhhh
57 :42:ags,hhhjd:57:hghg,hgruru:120:fghgh,gh:12:hhhhhh
我需要创建另一个COL3列,如下所示:
COL1 COL2 COL3
12 :402:agshhhjd:45:hghghgruru,:12:fghg,hgh:22:hhhh fghg,hg
57 :42:agshhhjd:57:hghg,hgruru:120:fghghgh:12:hhhhhh hghg,hg
需要以这种方式创建新列COL 3:在同一行中搜索COL2中COL1的值,然后打印除“:”之外的7个字符。我尝试做的是使用切片,但无法正常工作。有人可以帮忙吗?
答案 0 :(得分:3)
您可以仅使用属性replace
,但首先必须更改列1的数据类型。我们需要替换COL2中的所有内容,并在COL1中的数字后保留措辞,即:
.*12:(\w{7}).*
因此,我们只捕获了七个字母并通过反向引用将它们称为“ value = \ 1”。同样,我们对第二行执行相同的操作。由于replace
已向量化,因此可以轻松完成此操作。虽然这会很慢
df['COL3'] = df.COL2.replace(regex=r'.*'+ df.COL1.astype('str') +':(\\w{7}).*',value="\\1")
df
COL1 COL2 COL3
0 12 :402:agshhhjd,:45:hghghgruru,:12:fghghgh,:22:hhhh fghghgh
1 57 :42:agshhhjd,:57:hghghgruru,:120:fghghgh,:12:h... hghghgr
您也可以这样做:
import re
[re.sub(".*"+str(i)+":(\\w{7}).*","\\1",j) for i,j in zip(df.COL1,df.COL2)]
更新后,您可以执行以下操作:
df.assign(COL3 = df.COL2.replace(regex=r'.*'+ df.COL1.astype('str')+':(.{7}).*',value="\\1"))
Out[102]:
COL1 COL2 COL3
0 12 :402:agshhhjd,:45:hghghgruru,:12:fghg,hgh,:22:... fghg,hg
1 57 :42:ags,hhhjd,:57:hghg,hgruru,:120:fghgh,gh,:1... hghg,hg
答案 1 :(得分:2)
使用列表理解和 re.findall
:
import re
df['COL3'] = [
re.findall('{}\:([a-z]{{7}})'.format(i), j) for i, j in zip(df.COL1, df.COL2)
]
COL1 COL2 COL3
0 12 :402:agshhhjd,:45:hghghgruru,:12:fghghgh,:22:hhhh [fghghgh]
1 57 :42:agshhhjd,:57:hghghgruru,:120:fghghgh,:12:h... [hghghgr]
您还可以使用列表推导和 split
,尽管如果在COL2
中找不到第一个值,则会抛出错误:
[j.split('{}:'.format(i))[1][:7] for i, j in zip(df.COL1, df.COL2)]
# ['fghghgh', 'hghghgr']
如果可以保证在COL2
中找到值 ,则使用split更快:
df = pd.concat([df]*10000)
%timeit [re.findall('{}\:([a-z]{{7}})'.format(i), j) for i, j in zip(df.COL1, df.COL2)]
28.3 ms ± 1.34 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit [j.split('{}:'.format(i))[1][:7] for i, j in zip(df.COL1, df.COL2)]
12 ms ± 45.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
答案 2 :(得分:0)
为此:
hdfs://namenode-host:port/path/to/your/files
希望这会有所帮助