Removing Suffix From Dataframe Column Names - Python

Viewed 3917

I am trying to remove a suffix from all columns in a dataframe, however I am getting error messages. Any suggestions would be appreciated.

df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('ABCD'))
df.add_suffix('_x')

def strip_right(df.columns, _x):
    if not text.endswith("_x"):
        return text
    # else
    return text[:len(df.columns)-len("_x")]

Error:

def strip_right(tmp, "_x"):
                            ^
SyntaxError: invalid syntax

I've also tried removing the quotations.

def strip_right(df.columns, _x):
    if not text.endswith(_x):
        return text
    # else
    return text[:len(df.columns)-len(_x)]

Error:

def strip_right(df.columns, _x):
                      ^
SyntaxError: invalid syntax
2 Answers

Here is a more concrete example:.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('ABCD'))
df = df.add_suffix('_x')

print ("With Suffix")
print(df.head())

def strip_right(df, suffix='_x'):
    df.columns = df.columns.str.rstrip(suffix)

strip_right(df) 

print ("\n\nWithout Suffix")
print(df.head())

Output:

With Suffix
   A_x  B_x  C_x  D_x
0    0    7    0    2
1    5    1    8    5
2    6    2    0    1
3    6    6    5    6
4    8    6    5    8


Without Suffix
   A  B  C  D
0  0  7  0  2
1  5  1  8  5
2  6  2  0  1
3  6  6  5  6
4  8  6  5  8

I found a bug in the implementation of the accepted answer. The docs for pandas.Series.str.rstrip() reference str.rstrip(), which states:

"The chars argument is not a suffix; rather, all combinations of its values are stripped."

Instead I had to use pandas.Series.str.replace to remove the actual suffix from my column names. See the modified example below.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('ABCD'))
df = df.add_suffix('_x')
df['Ex_'] = np.random.randint(0,10,size=(10, 1))

df1 = pd.DataFrame(df, copy=True)
print ("With Suffix")
print(df1.head())

def strip_right(df, suffix='_x'):
    df.columns = df.columns.str.rstrip(suffix)

strip_right(df1) 

print ("\n\nAfter .rstrip()")
print(df1.head())

def replace_right(df, suffix='_x'):
    df.columns = df.columns.str.replace(suffix+'$', '', regex=True)

print ("\n\nWith Suffix")
print(df.head())

replace_right(df)

print ("\n\nAfter .replace()")
print(df.head())

Output:

With Suffix
   A_x  B_x  C_x  D_x  Ex_
0    4    9    2    3    4
1    1    6    5    8    6
2    2    5    2    3    6
3    1    4    7    6    4
4    3    9    3    5    8


After .rstrip()
   A  B  C  D  E
0  4  9  2  3  4
1  1  6  5  8  6
2  2  5  2  3  6
3  1  4  7  6  4
4  3  9  3  5  8


After .replace()
   A  B  C  D  Ex_
0  4  9  2  3    4
1  1  6  5  8    6
2  2  5  2  3    6
3  1  4  7  6    4
4  3  9  3  5    8
Related