我需要根据此列表从每行中提取最后一个字符:
<DataGridComboBoxColumn ItemsSource="{Binding Names}" SelectedItemBinding="{Binding Name}" />
这里是lst = [ '-ae-' , '-ap-' , '-vn-' , '-au-' , '-aw-' , '-be-' , '-bp-' , '-br-' , '-dz-' ]
的示例:
df['CN']
我使用了以下代码:
1: aes-sof-mar-goo-wh-en-ap-bro-sear-vn-loc
2: aes-br-mar-goo-ww-en-dz-bp-cen
3: aes-apt-au-goo-vn-en-br-bp
我需要返回列表上显示的最后一个元素:
def param(df):
lst = ['-ae-','-ap-','-vn-','-au-','-aw-','-be-','-bp-','-br-', '-dz-']
for x in lst:
if x in df['CN']:
return x
df['budget'] = df.apply(param, axis=1)
但是我的代码返回了每行交叉的第一个元素:
1: -vn-
2: -bp-
3: -bp-
答案 0 :(得分:1)
使用rfind
查找最右边的事件。使用max
查找最右边的最右边的事件。此代码假定将至少找到一个lst
成员;如果没有找到,它将返回一个lst
成员。
def param(df):
lst = ['-ae-','-ap-','-vn-','-au-','-aw-','-be-','-bp-','-br-', '-dz-']
return max(lst, key=lambda x: rfind(df, x))
这是更长的时间,但是在合理的时候会返回None
:
def param(df):
lst = ['-ae-','-ap-','-vn-','-au-','-aw-','-be-','-bp-','-br-', '-dz-']
pos = [(rfind(df, x), x) for x in lst]
if not pos: return None
m = max(pos)
if m[0] == -1: return None
return m[1]
答案 1 :(得分:1)
使用series.str.findall()
和series.str()
的熊猫方式:
pat=r'(?=({}))'.format('|'.join(re.escape(x) for x in lst))# @thanks Amadan
#'(?=(\\-ae\\-|\\-ap\\-|\\-vn\\-|\\-au\\-|\\-aw\\-|\\-be\\-|\\-bp\\-|\\-br\\-|\\-dz\\-))'
df['CN'].str.findall(pat).str[-1]
0 -vn-
1 -dz-
2 -br-
答案 2 :(得分:1)
使用np.in1d
l = [i.replace('-','') for i in lst]
df['CN'].apply(lambda x: '-'+ np.array(l)[np.in1d(l,x.split('-'))][-1] + '-')
输出
0 -vn-
1 -dz-
2 -br-