Saya memiliki dua kolom seperti ini:

                                       string                    s
0    the best new york cheesecake new york ny             new york
1               houston public school houston              houston

Saya ingin menghapus kemunculan terakhir s di string. Untuk konteksnya, DataFrame saya memiliki ratusan ribu baris. Saya tahu tentang str.replace dan str.rfind, tetapi tidak ada yang melakukan kombinasi yang diinginkan dari keduanya, dan saya gagal dalam mengimprovisasi solusi.

Terima kasih sebelumnya atas bantuan apa pun!

4
user49007 20 Agustus 2017, 04:40

2 jawaban

Jawaban Terbaik

Anda dapat menggunakan rsplit dan join:

df.apply(lambda x: ''.join(x['string'].rsplit(x['s'],1)),axis=1)

Keluaran:

0    the best new york cheesecake  ny
1              houston public school 
dtype: object

Edit:

df['string'] = df.apply(lambda x: ''.join(x['string'].rsplit(x['s'],1)),axis=1).str.replace('\s\s',' ')

print(df)

Keluaran:

                            string         s  third
0  the best new york cheesecake ny  new york      1
1           houston public school    houston      1
5
Scott Boston 20 Agustus 2017, 02:37

Opsi 1
Vektor rsplit dengan pemahaman

from numpy.core.defchararray import rsplit

v = df.string.values.astype(str)
s = df.s.values.astype(str)

df.assign(string=[' '.join([x.strip() for x in y]) for y in rsplit(v, s, 1)])

                            string         s
0  the best new york cheesecake ny  new york
1           houston public school    houston

Opsi 2
Menggunakan re.sub
Regex di sini mencari nilai dari s yang tidak diikuti oleh nilai lain yang sama.

import re

v = df.string.values.astype(str)
s = df.s.values.astype(str)
f = lambda i, j: re.sub(r' *{0} *(?!.*{0}.*)'.format(i), ' ', j).strip()

df.assign(string=[f(i, j) for i, j in zip(s, v)])

                            string         s
0  the best new york cheesecake ny  new york
1            houston public school   houston
2
piRSquared 20 Agustus 2017, 04:36