Pandas – Chech if two columns matches regex
I had parsed tables data from millins of PDFs.
As it a sensitive data, I tryed my best to show some of the particual situations of this
Sample DataFrame
| col0 | col1 | col2 | col3 | col4 | col5 | col6 | col 7 |
|---|---|---|---|---|---|---|---|
| 201707 | CNPJ: 98.777.666/0001-05 | NaN | NaN | NaN | NaN | NaN | NaN |
| 201707 | My Company Name is … | NaN | NaN | NaN | NaN | NaN | NaN |
| 201707 | Red Hot Chilli Peppers | 01.234.567/0001-05 | 13.358,25 | NaN | 13.358,25 | NaN | NaN |
| 201707 | Guns n’ Roses | 23.456.789/0001-07 | 11.134,63 | NaN | 11.134,63 | NaN | NaN |
| 201707 | Metallica | 32.586.709/0001-01 | 3.391,75 | NaN | 3.391,75 | NaN | NaN |
| 201707 | Alice in Chains | 57.888.999/0003-01 | 10.000,00 | 10.000,00 | 20.000,00 | NaN | NaN |
| 201707 | Hendrix | 00.777.888/0001-01 | 50.000,00 | 1.000,00 | 51.000,00 | NaN | NaN |
| 201707 | NaN | june/2017 | NaN | NaN | NaN | NaN | NaN |
| 201707 | Total: | 7.074.541,25 | 9.008.042,27 | 16.082.583,52 | NaN | NaN | NaN |
| 201708 | NaN | NaN | NaN | NaN | NaN | NaN | CNPJ: 98.777.666/0001-05 |
| 201708 | NaN | NaN | NaN | NaN | NaN | NaN | My Company Name is … |
| 201708 | 01.234.567/0001-05 | 13.358,25 | NaN | 13.358,25 | NaN | NaN | Red Hot Chilli Peppers |
| 201708 | 23.456.789/0001-07 | 11.134,63 | NaN | 11.134,63 | NaN | NaN | Guns n’ Roses |
| 201708 | 32.586.709/0001-01 | 3.391,75 | NaN | 3.391,75 | NaN | NaN | Metallica |
| 201708 | 57.888.999/0003-01 | 10.000,00 | 10.000,00 | 20.000,00 | NaN | NaN | Alice in Chains |
| 201708 | 00.777.888/0001-01 | 50.000,00 | 1.000,00 | 51.000,00 | NaN | NaN | NaN |
| 201708 | june/2017 | NaN | NaN | NaN | NaN | NaN | NaN |
New company_code checking two columns
pattern like 01.234.567/0001-05
I want to create a new columns, company_code, checking Regular expressions.
- If
col1matches the pattern then return thestringthat iscol1 - If
col2matches the pattern then return thestringthat iscol2 - else: return
'-'
The result expected is
| col0 | col1 | col2 | col3 | col4 | col5 | col6 | col 7 | company_code |
|---|---|---|---|---|---|---|---|---|
| 201707 | CNPJ: 98.777.666/0001-05 | NaN | NaN | NaN | NaN | NaN | NaN | – |
| 201707 | My Company Name is … | NaN | NaN | NaN | NaN | NaN | NaN | – |
| 201707 | Red Hot Chilli Peppers | 01.234.567/0001-05 | 13.358,25 | NaN | 13.358,25 | NaN | NaN | 01.234.567/0001-05 |
| 201707 | Guns n’ Roses | 23.456.789/0001-07 | 11.134,63 | NaN | 11.134,63 | NaN | NaN | 23.456.789/0001-07 |
| 201707 | Metallica | 32.586.709/0001-01 | 3.391,75 | NaN | 3.391,75 | NaN | NaN | 32.586.709/0001-01 |
| 201707 | Alice in Chains | 57.888.999/0003-01 | 10.000,00 | 10.000,00 | 20.000,00 | NaN | NaN | 57.888.999/0003-01 |
| 201707 | Hendrix | 00.777.888/0001-01 | 50.000,00 | 1.000,00 | 51.000,00 | NaN | NaN | 00.777.888/0001-01 |
| 201707 | NaN | june/2017 | NaN | NaN | NaN | NaN | NaN | – |
| 201707 | Total: | 7.074.541,25 | 9.008.042,27 | 16.082.583,52 | NaN | NaN | NaN | – |
| 201708 | NaN | NaN | NaN | NaN | NaN | NaN | CNPJ: 98.777.666/0001-05 | – |
| 201708 | NaN | NaN | NaN | NaN | NaN | NaN | My Company Name is … | – |
| 201708 | 01.234.567/0001-05 | 13.358,25 | NaN | 13.358,25 | NaN | NaN | Red Hot Chilli Peppers | 01.234.567/0001-05 |
| 201708 | 23.456.789/0001-07 | 11.134,63 | NaN | 11.134,63 | NaN | NaN | Guns n’ Roses | 23.456.789/0001-07 |
| 201708 | 32.586.709/0001-01 | 3.391,75 | NaN | 3.391,75 | NaN | NaN | Metallica | 32.586.709/0001-01 |
| 201708 | 57.888.999/0003-01 | 10.000,00 | 10.000,00 | 20.000,00 | NaN | NaN | Alice in Chains | 57.888.999/0003-01 |
| 201708 | 00.777.888/0001-01 | 50.000,00 | 1.000,00 | 51.000,00 | NaN | NaN | Hendrix | 00.777.888/0001-01 |
| 201708 | june/2017 | NaN | NaN | NaN | NaN | NaN | NaN | – |
I had tried a lot to doing this. Checked many youtube channels, stack posts…
But cannot solve.
If someone can help me…. Thanks a lot!
>Solution :
You can try np.select
m1 = df['col1'].str.contains('^\d{2}\.\d{3}\.\d{3}/\d{4}-\d{2}$', na=False)
m2 = df['col2'].str.contains('^\d{2}\.\d{3}\.\d{3}/\d{4}-\d{2}$', na=False)
df['company_code'] = np.select(
[m1, m2],
[df['col1'], df['col2']],
'-'
)
print(df['company_code'])
0 -
1 -
2 01.234.567/0001-05
3 23.456.789/0001-07
4 32.586.709/0001-01
5 57.888.999/0003-01
6 00.777.888/0001-01
7 -
8 -
9 -
10 -
11 01.234.567/0001-05
12 23.456.789/0001-07
13 32.586.709/0001-01
14 57.888.999/0003-01
15 00.777.888/0001-01
16 -
Name: company_code, dtype: object