在数据帧中将字符串拆分为3(三元)

2024-06-28 20:38:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个df:

col1
AAP CO. LTD.
AAS dds dTdD.

我正在尝试创建一个函数,该函数生成一个类似col2的列,其中每3(或n)个字符分割col1

col1           col2
AAP CO. LTD.   ['AAP','AP ','P C','CO.','O. '...]
AAS dds dTdD.  ['AAS','AS ','S d','dds','ds '...]

我尝试过这段代码,但它只是为每一行重复相同的字符串列表

def trigram(self):
    for b in df.parent_org_name:
        a = ["".join(j) for j in zip(*[b[i:] for i in range(3)])]
    #     [b[i:i+3] for i in range(len(b)-1)]
    return a
    #     print(a)
    
df.apply(trigram, axis=1)

有什么想法吗


Tags: 函数indfforrangetrigramcol2col1
3条回答

如果提供的N大于字符串长度(当前我在列表中返回原始字符串),则可以添加更多逻辑,具体取决于应该发生什么

string slice,将slice start和stop索引增加1,并确保在到达字符串末尾时停止,否则返回的子字符串可能是<;长度N

import numpy as np

def split_str(s, N):
    rmax = np.clip(len(s)-N, a_min=0, a_max=None)+1
    return [s[0+i:N+i] for i in range(0, rmax)]

df['col1'].apply(lambda x: split_str(x, 3))
#0    [AAP, AP , P C,  CO, CO., O. , . L,  LT, LTD, ...
#1    [AAS, AS , S d,  dd, dds, ds , s d,  dT, dTd, ...
#Name: col1, dtype: object

# To show actual values
df['col1'].apply(lambda x: split_str(x, 3))[0]
#['AAP', 'AP ', 'P C', ' CO', 'CO.', 'O. ', '. L', ' LT', 'LTD', 'TD.']

将函数定义更改如下,而不是在所有行上循环-

def trigram(self):
    b=self.col1
    a = ["".join(j) for j in zip(*[b[i:] for i in range(3)])]
#        a = ["".join(j) for j in zip(*[b[i:] for i in range(3)])]
    #     [b[i:i+3] for i in range(len(b)-1)]
    return a

我想这就是你需要的:)。如果需要使用不同于3的参数n来运行它,那么他们可以相应地更改括号中的i+3

df["col2"] = df.apply(lambda x: [x[0][i:i+3] for i in range(0, len(x[0]))],axis=1) 
#The result looks as follows

   col1          col2
0  AAP CO. LTD.  [AAP, AP , P C,  CO, CO., O. , . L,  LT, LTD, ... 
1  AAS dds dTdD. [AAS, AS , S d,  dd, dds, ds , s d,  dT, dTd, ... 

相关问题 更多 >