pandas regex соответствующие строки, начинающиеся слева направо с использованием другого столбца - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть df, мне нравится сопоставлять amount с левого начала inv_id и создать логический столбец left_match, True - если есть совпадение, False - othwise,

amount    inv_id        
309.9     30990071218
3130.0    313000B20180501
3330.50   3330.5020180425
17.35     13249261 100117
43.2      9037878 020418

Сначала я удалю все нечисловые символы с inv_id,

s = df[inv_id].str.replace(r'\D+', '')

затем преобразовать amount * 100 в строки,

df['amt_str'] = (df['amount']*100).round().astype(int).astype(str) 

Мне интересно, как использовать amt_str, чтобы соответствовать s. Результаты должны выглядеть примерно так:

amount    inv_id             left_match        
309.9     30990071218        True
3130.0    313000B20180501    True
3330.50   3330.5020180425    True
17.35     13249261 100117    False
43.2      9037878 020418     False

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Я думаю, вам нужно:

df['inv_id_temp'] = df['inv_id'].str.replace('.','')
df['left_match'] = df.apply(lambda x: x['amt_str']==x['inv_id_temp'][:len(x['amt_str'])],1)

df[['amount', 'inv_id','left_match']]

    amount  inv_id          left_match
0   309.90  30990071218     True
1   3130.00 313000B20180501 True
2   3330.50 33305020180425  True
3   17.35   13249261 100117 False
4   43.20   9037878 020418  False
0 голосов
/ 07 сентября 2018
df['inv_id_numeric'] = df['inv_id'].str.replace(r'\D+', '')
df['amt_str'] = (df['amount']*100).round().astype(int).astype(str)
df['left_match'] = df.apply(lambda x: x['inv_id_numeric'].startswith(x['amt_str']), axis=1)

выход:

    amount           inv_id  inv_id_numeric amt_str  left_match
0   309.90      30990071218     30990071218   30990        True
1  3130.00  313000B20180501  31300020180501  313000        True
2  3330.50  3330.5020180425  33305020180425  333050        True
3    17.35  13249261 100117  13249261100117    1735       False
4    43.20   9037878 020418   9037878020418    4320       False
0 голосов
/ 07 сентября 2018
df['left_match'] = df.apply(lambda x:True if re.search(str(x['amount']).split('.')[0],x['inv_id']).start() ==0 else False,axis=1)
df

выход:

amount  inv_id  left_match
0   309.90  30990071218 True
1   3130.00 313000B20180501 True
2   17.35   13249261 100117 False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...