Handling periods ('.') in CSV column names with Pandas

Clash Royale CLAN TAG#URR8PPP
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty margin-bottom:0;
up vote
1
down vote
favorite
I'm reading and processing a fairly large csv using Pandas and Python 3.7. Header names in the CSV have periods in them ('full stops', Britons say). That's a problem when you want to address data cells by column name.
test.csv:
"name","birth.place","not.important"
"John","",""
"Paul","Liverpool","blue"
# -*- coding: utf-8 -*-
import pandas as pd
infile = 'test.csv'
useful_cols = ['name', 'birth.place']
df = pd.read_csv(infile, usecols=useful_cols, encoding='utf-8-sig', engine='python')
# replace '.' by '_'
df.columns = df.columns.str.replace('.', '_')
# we may want to iterate over useful_cols later, so to keep things consistent:
useful_cols = [s.replace('', '') for s in useful_cols]
# now we can do this..
print(df['birth_place'])
# ... and this
for row in df.itertuples():
print(row.birth_place)
# ain't that nice?
It works, but since Pandas is such a powerful library and the use case is quite common, I'm wondering if there isn't an even better way of doing this.
python csv pandas
add a comment |Â
up vote
1
down vote
favorite
I'm reading and processing a fairly large csv using Pandas and Python 3.7. Header names in the CSV have periods in them ('full stops', Britons say). That's a problem when you want to address data cells by column name.
test.csv:
"name","birth.place","not.important"
"John","",""
"Paul","Liverpool","blue"
# -*- coding: utf-8 -*-
import pandas as pd
infile = 'test.csv'
useful_cols = ['name', 'birth.place']
df = pd.read_csv(infile, usecols=useful_cols, encoding='utf-8-sig', engine='python')
# replace '.' by '_'
df.columns = df.columns.str.replace('.', '_')
# we may want to iterate over useful_cols later, so to keep things consistent:
useful_cols = [s.replace('', '') for s in useful_cols]
# now we can do this..
print(df['birth_place'])
# ... and this
for row in df.itertuples():
print(row.birth_place)
# ain't that nice?
It works, but since Pandas is such a powerful library and the use case is quite common, I'm wondering if there isn't an even better way of doing this.
python csv pandas
This looks a bit short on code, how do you use this, as I may recommend this. However if you use it differently, then I wouldn't.
â Peilonrayz
Jul 19 at 0:24
@Peilonrayz I chose Pandas over thecsvlibrary, because it has all these powerful features that I'm keen to explore. In a world without Pandas, I'd have certainly gone forcsv.
â RolfBly
Jul 19 at 8:05
add a comment |Â
up vote
1
down vote
favorite
up vote
1
down vote
favorite
I'm reading and processing a fairly large csv using Pandas and Python 3.7. Header names in the CSV have periods in them ('full stops', Britons say). That's a problem when you want to address data cells by column name.
test.csv:
"name","birth.place","not.important"
"John","",""
"Paul","Liverpool","blue"
# -*- coding: utf-8 -*-
import pandas as pd
infile = 'test.csv'
useful_cols = ['name', 'birth.place']
df = pd.read_csv(infile, usecols=useful_cols, encoding='utf-8-sig', engine='python')
# replace '.' by '_'
df.columns = df.columns.str.replace('.', '_')
# we may want to iterate over useful_cols later, so to keep things consistent:
useful_cols = [s.replace('', '') for s in useful_cols]
# now we can do this..
print(df['birth_place'])
# ... and this
for row in df.itertuples():
print(row.birth_place)
# ain't that nice?
It works, but since Pandas is such a powerful library and the use case is quite common, I'm wondering if there isn't an even better way of doing this.
python csv pandas
I'm reading and processing a fairly large csv using Pandas and Python 3.7. Header names in the CSV have periods in them ('full stops', Britons say). That's a problem when you want to address data cells by column name.
test.csv:
"name","birth.place","not.important"
"John","",""
"Paul","Liverpool","blue"
# -*- coding: utf-8 -*-
import pandas as pd
infile = 'test.csv'
useful_cols = ['name', 'birth.place']
df = pd.read_csv(infile, usecols=useful_cols, encoding='utf-8-sig', engine='python')
# replace '.' by '_'
df.columns = df.columns.str.replace('.', '_')
# we may want to iterate over useful_cols later, so to keep things consistent:
useful_cols = [s.replace('', '') for s in useful_cols]
# now we can do this..
print(df['birth_place'])
# ... and this
for row in df.itertuples():
print(row.birth_place)
# ain't that nice?
It works, but since Pandas is such a powerful library and the use case is quite common, I'm wondering if there isn't an even better way of doing this.
python csv pandas
edited Jul 19 at 6:06
Jamalâ¦
30.1k11114225
30.1k11114225
asked Jul 18 at 19:24
RolfBly
584317
584317
This looks a bit short on code, how do you use this, as I may recommend this. However if you use it differently, then I wouldn't.
â Peilonrayz
Jul 19 at 0:24
@Peilonrayz I chose Pandas over thecsvlibrary, because it has all these powerful features that I'm keen to explore. In a world without Pandas, I'd have certainly gone forcsv.
â RolfBly
Jul 19 at 8:05
add a comment |Â
This looks a bit short on code, how do you use this, as I may recommend this. However if you use it differently, then I wouldn't.
â Peilonrayz
Jul 19 at 0:24
@Peilonrayz I chose Pandas over thecsvlibrary, because it has all these powerful features that I'm keen to explore. In a world without Pandas, I'd have certainly gone forcsv.
â RolfBly
Jul 19 at 8:05
This looks a bit short on code, how do you use this, as I may recommend this. However if you use it differently, then I wouldn't.
â Peilonrayz
Jul 19 at 0:24
This looks a bit short on code, how do you use this, as I may recommend this. However if you use it differently, then I wouldn't.
â Peilonrayz
Jul 19 at 0:24
@Peilonrayz I chose Pandas over the
csv library, because it has all these powerful features that I'm keen to explore. In a world without Pandas, I'd have certainly gone for csv.â RolfBly
Jul 19 at 8:05
@Peilonrayz I chose Pandas over the
csv library, because it has all these powerful features that I'm keen to explore. In a world without Pandas, I'd have certainly gone for csv.â RolfBly
Jul 19 at 8:05
add a comment |Â
1 Answer
1
active
oldest
votes
up vote
1
down vote
Did a little digging and found that you can use df._columnid when pandas df.columns runs into an issue with a name (in this example dealing with a ".")
I am sure you already know that you could just do df['birth.place'], since it's inside a string container, however it becomes tricky for row.birth.placeas you mentioned. For that you can do the following:
for row in df.itertuples():
print(row._2)
The _2 corresponds to the column id that pandas had issues parsing. It renamed it with an underscore and enumerated id in the column's list. Note that this renaming process only occurs when pandas ran into an issue grabbing the actual column name (i.e. row.name is still row.name, and you cannot use row._1 in-place of it). Hope that helps! Happy pythoning!
Thanks. I didn't mention what I had already found out: df[birth.place] only works on entire columns, not on cells.getattr(row, 'birth.place') doesn't work because the column is renamed, androw.birth.place` errorshas no attribute 'birth'.
â RolfBly
Jul 19 at 8:15
Right, getattr() would work the same then. You would say getattr(row, "_2"), but this is equivalent to saying row._2
â PydPiper
Jul 19 at 13:49
add a comment |Â
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
Did a little digging and found that you can use df._columnid when pandas df.columns runs into an issue with a name (in this example dealing with a ".")
I am sure you already know that you could just do df['birth.place'], since it's inside a string container, however it becomes tricky for row.birth.placeas you mentioned. For that you can do the following:
for row in df.itertuples():
print(row._2)
The _2 corresponds to the column id that pandas had issues parsing. It renamed it with an underscore and enumerated id in the column's list. Note that this renaming process only occurs when pandas ran into an issue grabbing the actual column name (i.e. row.name is still row.name, and you cannot use row._1 in-place of it). Hope that helps! Happy pythoning!
Thanks. I didn't mention what I had already found out: df[birth.place] only works on entire columns, not on cells.getattr(row, 'birth.place') doesn't work because the column is renamed, androw.birth.place` errorshas no attribute 'birth'.
â RolfBly
Jul 19 at 8:15
Right, getattr() would work the same then. You would say getattr(row, "_2"), but this is equivalent to saying row._2
â PydPiper
Jul 19 at 13:49
add a comment |Â
up vote
1
down vote
Did a little digging and found that you can use df._columnid when pandas df.columns runs into an issue with a name (in this example dealing with a ".")
I am sure you already know that you could just do df['birth.place'], since it's inside a string container, however it becomes tricky for row.birth.placeas you mentioned. For that you can do the following:
for row in df.itertuples():
print(row._2)
The _2 corresponds to the column id that pandas had issues parsing. It renamed it with an underscore and enumerated id in the column's list. Note that this renaming process only occurs when pandas ran into an issue grabbing the actual column name (i.e. row.name is still row.name, and you cannot use row._1 in-place of it). Hope that helps! Happy pythoning!
Thanks. I didn't mention what I had already found out: df[birth.place] only works on entire columns, not on cells.getattr(row, 'birth.place') doesn't work because the column is renamed, androw.birth.place` errorshas no attribute 'birth'.
â RolfBly
Jul 19 at 8:15
Right, getattr() would work the same then. You would say getattr(row, "_2"), but this is equivalent to saying row._2
â PydPiper
Jul 19 at 13:49
add a comment |Â
up vote
1
down vote
up vote
1
down vote
Did a little digging and found that you can use df._columnid when pandas df.columns runs into an issue with a name (in this example dealing with a ".")
I am sure you already know that you could just do df['birth.place'], since it's inside a string container, however it becomes tricky for row.birth.placeas you mentioned. For that you can do the following:
for row in df.itertuples():
print(row._2)
The _2 corresponds to the column id that pandas had issues parsing. It renamed it with an underscore and enumerated id in the column's list. Note that this renaming process only occurs when pandas ran into an issue grabbing the actual column name (i.e. row.name is still row.name, and you cannot use row._1 in-place of it). Hope that helps! Happy pythoning!
Did a little digging and found that you can use df._columnid when pandas df.columns runs into an issue with a name (in this example dealing with a ".")
I am sure you already know that you could just do df['birth.place'], since it's inside a string container, however it becomes tricky for row.birth.placeas you mentioned. For that you can do the following:
for row in df.itertuples():
print(row._2)
The _2 corresponds to the column id that pandas had issues parsing. It renamed it with an underscore and enumerated id in the column's list. Note that this renaming process only occurs when pandas ran into an issue grabbing the actual column name (i.e. row.name is still row.name, and you cannot use row._1 in-place of it). Hope that helps! Happy pythoning!
edited Jul 19 at 7:39
Graipher
20.4k42981
20.4k42981
answered Jul 19 at 4:22
PydPiper
113
113
Thanks. I didn't mention what I had already found out: df[birth.place] only works on entire columns, not on cells.getattr(row, 'birth.place') doesn't work because the column is renamed, androw.birth.place` errorshas no attribute 'birth'.
â RolfBly
Jul 19 at 8:15
Right, getattr() would work the same then. You would say getattr(row, "_2"), but this is equivalent to saying row._2
â PydPiper
Jul 19 at 13:49
add a comment |Â
Thanks. I didn't mention what I had already found out: df[birth.place] only works on entire columns, not on cells.getattr(row, 'birth.place') doesn't work because the column is renamed, androw.birth.place` errorshas no attribute 'birth'.
â RolfBly
Jul 19 at 8:15
Right, getattr() would work the same then. You would say getattr(row, "_2"), but this is equivalent to saying row._2
â PydPiper
Jul 19 at 13:49
Thanks. I didn't mention what I had already found out: df[
birth.place] only works on entire columns, not on cells. getattr(row, 'birth.place') doesn't work because the column is renamed, and row.birth.place` errors has no attribute 'birth'.â RolfBly
Jul 19 at 8:15
Thanks. I didn't mention what I had already found out: df[
birth.place] only works on entire columns, not on cells. getattr(row, 'birth.place') doesn't work because the column is renamed, and row.birth.place` errors has no attribute 'birth'.â RolfBly
Jul 19 at 8:15
Right, getattr() would work the same then. You would say getattr(row, "_2"), but this is equivalent to saying row._2
â PydPiper
Jul 19 at 13:49
Right, getattr() would work the same then. You would say getattr(row, "_2"), but this is equivalent to saying row._2
â PydPiper
Jul 19 at 13:49
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f199772%2fhandling-periods-in-csv-column-names-with-pandas%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
This looks a bit short on code, how do you use this, as I may recommend this. However if you use it differently, then I wouldn't.
â Peilonrayz
Jul 19 at 0:24
@Peilonrayz I chose Pandas over the
csvlibrary, because it has all these powerful features that I'm keen to explore. In a world without Pandas, I'd have certainly gone forcsv.â RolfBly
Jul 19 at 8:05