Панды: как добавить отсутствующие столбцы заголовков

Здравствуйте, у меня есть csv (разделенный табуляцией) с заголовком, и я хотел бы загрузить его в Pandas DataFrame в Python 3.5. Проблема в том, что отсутствуют некоторые заголовки (есть столбцы с данными, но без заголовка - как в примере ниже). Я попытался загрузить его с помощью функции read_csv, но если я не пропущу первую строку, она объединит первые строки данных, чтобы соответствовать количеству заголовков и количеству столбцов данных.

Есть ли способ прочитать этот csv и автоматически добавить недостающие заголовки? Как Header4 и Header 5 в примере ниже?

Спасибо

| Header1 | Header2 | Header3 |        |        |
|---------|---------|---------|--------|--------|
| value1  | value2  | value3  | value4 | value5 |
| value1  | value2  | value3  | value4 | value5 |

person stanedav    schedule 03.10.2017    source источник


Ответы (2)


Вы можете переименовать столбцы в постобработке с помощью dict:

print (df)
  Header1 Header2 Header3 Unnamed: 3 Unnamed: 4
0  value1  value2  value3     value4     value5
1  value1  value2  value3     value4     value5


df = df.rename(columns = {'Unnamed: 3':'Header4','Unnamed: 4':'Header5'})
print (df)
  Header1 Header2 Header3 Header4 Header5
0  value1  value2  value3  value4  value5
1  value1  value2  value3  value4  value5

Или по пользовательской функции:

f = lambda x: 'Header{}'.format(int(x.split()[1])+1) if 'Unnamed' in x else x
df = df.rename(columns = f)
print (df)
  Header1 Header2 Header3 Header4 Header5
0  value1  value2  value3  value4  value5
1  value1  value2  value3  value4  value5

Или используйте параметры names и header или names и skiprows:

df = pd.read_csv('file', names=['Header1','Header2','Header3','Header4','Header5'], header=0)
print (df)
  Header1 Header2 Header3 Header4 Header5
0  value1  value2  value3  value4  value5
1  value1  value2  value3  value4  value5

Or:

df = pd.read_csv('file',
                 names=['Header1','Header2','Header3','Header4','Header5'],
                 skiprows=1)
print (df)
  Header1 Header2 Header3 Header4 Header5
0  value1  value2  value3  value4  value5
1  value1  value2  value3  value4  value5
person jezrael    schedule 03.10.2017
comment
Я попробовал только ваше последнее решение, но оно заменило существующую первую строку таблицы. - person 007mrviper; 13.11.2018

Вы можете добиться этого следующим образом:

df.columns = df.columns[:3].tolist()  + ['Header4', 'Header5']

выход:

    Header1    Header2    Header3    Header4   Header5
0   value1     value2     value3     value4    value5 
1   value1     value2     value3     value4    value5 
person Mohamed Ali JAMAOUI    schedule 03.10.2017