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
col1
matches the pattern then return thestring
that iscol1
- If
col2
matches the pattern then return thestring
that 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!
CodePudding user response:
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