在PandasDataFrame中移动句子中的特定单词

eqoofvh9  于 2022-12-09  发布在  其他
关注(0)|答案(3)|浏览(132)

我有这个数据集:
| A列|
| - -|
| 点abcdefg|
| 弗吉克尔|
| abcdg点|
| 操作序号cv|
| 英国石油公司|
| 标准BP|
我想把单词“pt”、“cv”和“bp”放在句子的最后,所以这就是我想要的输出:
| A列|
| - -|
| abc定义点|
| 福吉克品种|
| abcdg点|
| 操作序号cv|
| 标准BP|
| 标准BP|
我还没有尝试任何代码,但我发现了这段代码,但我在修改它时遇到了麻烦,因为我想将它应用到整个DataFrame。

def order_word(s, word, delta):
        words = s.split()
        oldpos = words.index(word)
        words.insert(oldpos+delta, words.pop(oldpos))
        return ' '.join(words)

有人能帮我构建代码吗?提前感谢。

blpfk2vs

blpfk2vs1#

下面是一个使用pandas.Series.str.splitsorted的命题:

df["Column A"] = (
                    df["Column A"]
                        .str.split()
                        .apply(lambda x: " ".join(sorted(x, key=len, reverse=True)))
                  )
#输出:
print(df)
     Column A
0  abcdefg pt
1   fghikl cv
2    abcdg pt
3    opqrs cv
4   ststst bp
5    qwert bp
ctzwtxfj

ctzwtxfj2#

可以将正则表达式与str.replace一起使用:

df['Column A'] = df['Column A'].str.replace(r'\s*\b(cv|pt|bp)\b\s*(.*$)',
                                            r'\2 \1', regex=True)

输出(为清楚起见,作为新列):

Column A    Column B
0  pt abcdefg  abcdefg pt
1   cv fghikl   fghikl cv
2    abcdg pt    abcdg pt
3    opqrs cv    opqrs cv
4   bp ststst   ststst bp
5    qwert bp    qwert bp

regex demo

rur96b6h

rur96b6h3#

示例

data = {'Column A': {0: 'pt abcdefg',1: 'cv fghikl',2: 'abcdg pt',3: 'opqrs cv',4: 'bp ststst',5: 'qwert bp',6: 'aaaa pt cc'}}
df = pd.DataFrame(data)

df

Column A
0   pt abcdefg
1   cv fghikl
2   abcdg pt
3   opqrs cv
4   bp ststst
5   qwert bp
6   aaaa pt cc

代码

s = (df['Column A'].str.replace(r'(.*)(pt|cv|bp)(.*)', r'\1 \3 \2', regex=True)
   .str.replace(r'(\s)+', r'\1', regex=True))

输出(s):

0    abcdefg pt
1     fghikl cv
2      abcdg pt
3      opqrs cv
4     ststst bp
5      qwert bp
6    aaaa cc pt
dtype: object

使s成为列
我做这个代码是为了中间有pt或cv。

更新

提问者说不存在中间的情况。
然后使用以下代码:

df['Column A'].str.replace(r'^(pt|cv|bp)[ ](.+)', r'\2 \1', regex=True)

相关问题