Я думаю, вам нужно назначить столбцы с перераспределением:
df = pd.DataFrame(columns=['ss ds', 'ss?aa', 'as sa'])
print (df)
Empty DataFrame
Columns: [ss ds, ss?aa, as sa]
Index: []
#replace first value of string by empty space and all another values by `_`
df.columns = (df.columns[:1].str.replace(' ', '').tolist() +
df.columns[1:].str.replace(' ', '_').tolist())
df.columns = df.columns.str.replace('?', '')
print (df)
Empty DataFrame
Columns: [ssds, ssaa, as_sa]
Index: []
Так что ваша функция должна быть изменена:
def tidy_columns(self):
self.columns = (self.columns[:1].str.replace(' ', '').tolist() +
self.columns[1:].str.replace(' ', '_').tolist())
self.columns = self.columns.str.replace('?', '')
return self.columns